【问题标题】:Can I use the Spring Security @PreAuthorize to inspect the HTTP headers?我可以使用 Spring Security @PreAuthorize 来检查 HTTP 标头吗?
【发布时间】:2017-07-25 20:48:08
【问题描述】:

我有一个用 Spring 编写的带有 Spring Security 的 REST API 和带有 Web Started 包的 Spring Boot。我的一些方法检查 JWT 令牌:

@RequestMapping(value = "/list",
        method = GET,
        produces = APPLICATION_JSON_VALUE)
public HttpEntity<List<Item>> list(@RequestHeader(name = TOKEN_HEADER) String token) {
    // validate token
    // do something
}

是否可以将令牌检查移至将通过@PreAuthorize 注释调用的方法?比如:

@RequestMapping(value = "/list",
        method = GET,
        produces = APPLICATION_JSON_VALUE)
@PreAuthorize("myMethod(headers)")
public HttpEntity<List<Item>> list(@RequestHeader(name = TOKEN_HEADER) String token) {
    // do something
}

void myMethod(HttpHeaders headers) {
    // validate token
}

令牌包含有关特定用户可以访问的资源的一些信息。如果令牌不包含用户请求的资源或底层数据层中的数据表明用户无权访问它,我将返回 HTTP 403。

【问题讨论】:

标签: java spring rest spring-mvc spring-security


【解决方案1】:

您正在尝试将身份验证和授权委托给控制器,这不是一个好主意。

处理headers上token的方法是实现一个过滤器,通过token封装认证和授权,并将登录的用户和用户角色放入会话中。

然后预授权注解根据需要检查上下文。

您可以查看https://jwt.io/ 了解令牌流程。

【讨论】:

  • 我已经有一个过滤器,它使用令牌进行身份验证和授权。但是,过滤器不知道特定用户是否创建了给定资源。现在我想返回一个 ID 为:GET /resource/1 的资源过滤器检查用户是否已登录并有权检索资源。然后控制器解析请求并使用对服务的调用来检查用户是否是资源 ID 1 的所有者。如果我说这是一个过滤器,那么过滤器就必须解析请求并调用服务。
  • @MartinTeeVarga 我正在尝试做类似的事情,你找到解决方案了吗,如果是,你做了什么?
猜你喜欢
  • 1970-01-01
  • 2011-03-06
  • 2017-10-22
  • 2015-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多