SecurityContext 权限不等于 ServletRequest 角色?
Posted
技术标签:
【中文标题】SecurityContext 权限不等于 ServletRequest 角色?【英文标题】:SecurityContext authorities does not equal ServletRequest roles? 【发布时间】:2016-05-01 20:59:43 【问题描述】:我试图用注释(@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 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);
【问题讨论】:
发布您的配置...以及您使用的 Spring 安全版本。 我远非 MVCE - 配置分布在许多项目中的许多类中。这不是“查找我的错误”问题,而是“这是如何工作的”问题。 唯一需要的就是安全配置和你正在使用哪个 Spring Security 版本的问题的答案。 @M.Deinum 如果你坚持,但我看不出这如何帮助回答 Spring Web Security 如何在内部工作的问题。 Spring Security 版本很重要,因为它可能已设置或未设置此方法的 servletrequest 集成。此外,您的 spring 安全设置可能会破坏正确的集成。因此提出了要求。 【参考方案1】:我假设(因为我无法让他们授权任何事情)@Secured 和 hasRole() 使用后者查找?
我的假设是错误的。两者都使用授予的权限,但方式不同。
@Secured
需要前缀,所以 @Secured("ROLE_READER")
有效。
hasRole
不使用前缀,所以 @PreAuthorize("hasRole('READER')")
有效。
两者都需要为授予的权限添加前缀,因此@Secured("READER")
永远不会起作用,即使有一个名为READER
的权限。
前缀可以配置RoleVoter
的rolePrefix
属性。
HttpServletRequest.isUserInRole
使用完全独立的系统,与 Spring 安全性无关。默认情况下不填充,也不需要填充。我相信在链中添加SecurityContextHolderAwareRequestFilter
会填充它
【讨论】:
假设您的问题是您已经为 Spring Security 与 servlet API 设置了适当的集成(调用servletApi
进行配置)。以上是关于SecurityContext 权限不等于 ServletRequest 角色?的主要内容,如果未能解决你的问题,请参考以下文章
Kubernetes中的Security Context, Resource requirement和Service Account