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

我假设(因为我无法让他们授权任何事情)@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);
    

【问题讨论】:

发布您的配置...以及您使用的 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 的权限。

前缀可以配置RoleVoterrolePrefix属性。

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

【讨论】:

假设您的问题是您已经为 Spring Security 与 servlet API 设置了适当的集成(调用 servletApi 进行配置)。

以上是关于SecurityContext 权限不等于 ServletRequest 角色?的主要内容,如果未能解决你的问题,请参考以下文章

Kubernetes中的Security Context, Resource requirement和Service Account

K8S上使用EFS时权限故障处理

Linux用户组和权限的概念

Linux用户及权限详解

在 Kubernetes 部署中设置 securityContext

FOSUserBundle (弃用SecurityContext )