我可以使用 Spring Security @PreAuthorize 来检查 HTTP 标头吗?

Posted

技术标签:

【中文标题】我可以使用 Spring Security @PreAuthorize 来检查 HTTP 标头吗?【英文标题】:Can I use the Spring Security @PreAuthorize to inspect the HTTP headers? 【发布时间】: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。

【问题讨论】:

复制到这个? ***.com/questions/26747452/… 【参考方案1】:

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

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

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

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

【讨论】:

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

以上是关于我可以使用 Spring Security @PreAuthorize 来检查 HTTP 标头吗?的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Spring Security 中识别身份验证提供者 user-service-ref

Spring Framework,Spring Security - 可以在没有 Spring Framework 的情况下使用 Spring Security?

升级后的 Spring Boot Oauth2 自动配置周期

我可以将 Spring Social 与 Spring Security 一起使用吗?

有啥方法可以强制在 spring-security 中的某些页面使用 https 吗?

Spring Security里怎么返回登录成功的json消息