1

我试图用注释(@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 安全配置减少到 spring boot 的(1.3.0)默认值,加上设置身份验证的过滤器。

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

1 回答 1

1

我假设(因为我无法让他们授权任何事情)@Secured 和 hasRole() 使用后者查找?

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

  • @Secured需要前缀,所以@Secured("ROLE_READER")有效。
  • hasRole不使用前缀,所以@PreAuthorize("hasRole('READER')")有效。
  • 两者都需要为授予的权限添加前缀,因此@Secured("READER")即使有一个名为 的权限,也永远不会起作用READER

可以使用RoleVoter'rolePrefix属性配置前缀。

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

于 2016-01-26T14:00:32.170 回答