我正在尝试使用已实现自我的JWT保护我的REST服务器(这意味着JWT中没有处理自我的JWT东西,其他所有东西当然都是Spring了)。

我有这个课:JWTToken implements Authentication

我有一个过滤器,负责将JWTToken实例设置为SecurityContextHolder:

public class JwtFilter extends GenericFilterBean {
public void doFilter(...) {
     ....
     JWTToken token = new JWTToken(jwt); // this init the Authentication object with all the jwt claims
     SecurityContextHolder.getContext().setAuthentication(token);
     ....
}

我也有调试此资源:
@RequestMapping(
        value = "/protected_resource",
        method = RequestMethod.POST
)
@RolesAllowed("admin")
public RESTResponse<String> debugJwt() {
    Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); // here I can see that the context is the right one
    return new RESTResponse<>("This was successful", "feedback message", true);
}

我错过了在任何在线资源中都找不到的难题的和平,这是如何实现WebSecurityConfigurerAdapter,尤其是configure(HttpSecurity http) metohd的方法。

例如,当我尝试这样做时:
http.authorizeRequests().anyRequest().authenticated()

请求没有通过此请求,资源也没有被调用。

我在这里想念什么?

最佳答案

您的JWTToken类应实现以下方法:

Collection<? extends GrantedAuthority> getAuthorities();

该实现应返回用户授予的角色的集合,其中一个将是“admin”角色,例如:
public Collection<? extends GrantedAuthority> getAuthorities() {
    return Collections.singletonList(new SimpleGrantedAuthority("admin"));
}

当然,根据您的情况,您将查询数据库或JWT token 并解析用户角色。

10-06 14:57