SecurityContext权限不等于ServletRequest角色?

时间:2016-01-25 14:03:08

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

我试图用注释(@Secured@PreAuthorize)替换一些手动权限检查。在调试它为什么不起作用时,我惊讶地发现这两个断言中的第二个在@RequestMapping控制器方法的顶部失败了。

Authentication auth = SecurityContextHolder.getContext().getAuthentication();
assert(auth.getAuthorities().contains(new SimpleGrantedAuthority("ROLE_READER"))); // passes
assert(request.isUserInRole("ROLE_READER")); // fails

我认为(因为我无法让他们授权任何内容)@SecuredhasRole()使用后者查找?

不应该从SecurityContext权限自动填充角色吗?

设置Authentication的过滤器是否应该单独添加角色?

修改

将spring security config命令设置为spring boot' s(1.3.0)默认值,再加上设置身份验证的过滤器。

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.addFilterBefore(new JwtAuthenticationFilter(), FilterSecurityInterceptor.class);
    }
}

1 个答案:

答案 0 :(得分:0)

  

我假设(因为我不能让他们授权任何东西)@Secured和hasRole()使用后者的查找?

我的假设是错误的。两者都使用授权的权限,但以不同的方式。

  • @Secured需要前缀,因此@Secured("ROLE_READER")有效。
  • hasRole不使用前缀,因此@PreAuthorize("hasRole('READER')")有效。
  • 两者都要求授予权限作为前缀,因此@Secured("READER")永远不会有效。

可以使用RoleVoter的{​​{1}}属性配置前缀。

rolePrefix使用完全独立的系统,与Spring安全无关。默认情况下不会填充它,也不需要填充。我相信在链中添加HttpServletRequest.isUserInRole将填充它