SecurityContext权限不等于ServletRequest角色?
SecurityContext authorities does not equal ServletRequest roles?
我试图用注释(@Secured
和 @PreAuthorize
)代替一些手动权限检查。在调试为什么它不起作用时,我惊讶地发现这两个断言中的第二个在 @RequestMapping
控制器方法的顶部失败了。
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
assert(auth.getAuthorities().contains(new SimpleGrantedAuthority("ROLE_READER"))); // passes
assert(request.isUserInRole("ROLE_READER")); // fails
我假设(因为我不能让他们授权任何东西)@Secured
和 hasRole()
使用后者查找?
这些角色不应该由 SecurityContext
当局自动填充吗?
设置 Authentication
的过滤器是否应该单独添加角色?
编辑:
将 spring 安全配置缩减为 spring 引导 (1.3.0) 默认值,加上设置身份验证的过滤器。
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.addFilterBefore(new JwtAuthenticationFilter(), FilterSecurityInterceptor.class);
}
}
I assume (as I can't get them to authorise anything) @Secured and hasRole() make use of the latter lookup?
我的假设是错误的。两者都使用授予的权限,但方式不同。
@Secured
需要前缀,因此 @Secured("ROLE_READER")
有效。
hasRole
不使用前缀,因此 @PreAuthorize("hasRole('READER')")
有效。
- 两者都需要授予的权限作为前缀,所以
@Secured("READER")
永远不会起作用,即使有一个名为 READER
. 的权限
前缀可以配置为RoleVoter
的rolePrefix
属性.
HttpServletRequest.isUserInRole
使用完全独立的系统,与 Spring 安全性无关。默认情况下不填充它,也不需要填充它。我相信在链中添加 SecurityContextHolderAwareRequestFilter
会填充它
我试图用注释(@Secured
和 @PreAuthorize
)代替一些手动权限检查。在调试为什么它不起作用时,我惊讶地发现这两个断言中的第二个在 @RequestMapping
控制器方法的顶部失败了。
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
assert(auth.getAuthorities().contains(new SimpleGrantedAuthority("ROLE_READER"))); // passes
assert(request.isUserInRole("ROLE_READER")); // fails
我假设(因为我不能让他们授权任何东西)@Secured
和 hasRole()
使用后者查找?
这些角色不应该由 SecurityContext
当局自动填充吗?
设置 Authentication
的过滤器是否应该单独添加角色?
编辑:
将 spring 安全配置缩减为 spring 引导 (1.3.0) 默认值,加上设置身份验证的过滤器。
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.addFilterBefore(new JwtAuthenticationFilter(), FilterSecurityInterceptor.class);
}
}
I assume (as I can't get them to authorise anything) @Secured and hasRole() make use of the latter lookup?
我的假设是错误的。两者都使用授予的权限,但方式不同。
@Secured
需要前缀,因此@Secured("ROLE_READER")
有效。hasRole
不使用前缀,因此@PreAuthorize("hasRole('READER')")
有效。- 两者都需要授予的权限作为前缀,所以
@Secured("READER")
永远不会起作用,即使有一个名为READER
. 的权限
前缀可以配置为RoleVoter
的rolePrefix
属性.
HttpServletRequest.isUserInRole
使用完全独立的系统,与 Spring 安全性无关。默认情况下不填充它,也不需要填充它。我相信在链中添加 SecurityContextHolderAwareRequestFilter
会填充它