2017-03-06 165 views
1

我有一个使用Spring Security和Spring Boot使用Web Started包编写的REST API。我有几个方法检查一个JWT令牌:我可以使用Spring Security @PreAuthorize检查HTTP标头吗?

@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.

+0

复制到此? http://stackoverflow.com/questions/26747452/how-to-use-custom-expressions-in-spring-security-preauthorize-postauthorize-an –

回答

0

您试图将身份验证和授权委派给控制器,并不是一个好主意。

在标头上处理标记的方法是实现一个过滤器,它通过令牌封装了认证和授权,并将登录的用户和角色放入会话中。

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

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

+0

我已经有一个过滤器,使用令牌进行身份验证和授权。但是,过滤器不知道特定用户是否创建了给定的资源。现在我想返回ID为的资源: 'GET/resource/1' 过滤器检查用户是否已登录并且有权检索资源。 控制器然后解析请求,并使用对服务的调用来检查用户是否是资源ID 1的所有者。 如果我要把这是一个过滤器,那么过滤器将不得不解析请求并调用服务。 – sm4

相关问题