使用 Spring 安全角色层次结构时拒绝访问
Denied access when using Spring Security RoleHierarchy
我正在我的 Web 应用程序中配置对我的 REST WS 的角色访问,我想实现一个角色层次结构。
我定义了这个bean
@Bean
public RoleHierarchyImpl roleHierarchy() {
RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl();
roleHierarchy.setHierarchy(
UserManagement.RoleEnum.ADMIN.getRoleString() + " > " + UserManagement.RoleEnum.WEBUI.getRoleString()
);
return roleHierarchy;
}
private SecurityExpressionHandler<FilterInvocation> webExpressionHandler() {
DefaultWebSecurityExpressionHandler defaultWebSecurityExpressionHandler = new DefaultWebSecurityExpressionHandler();
defaultWebSecurityExpressionHandler.setRoleHierarchy(roleHierarchy());
return defaultWebSecurityExpressionHandler;
}
然后在我的 SecurityConfiguration.configure(HttpSecurity http)
方法中我写:
String[] URLsToBeProtectedAsWebUi = {PREFIX + "/auth/tokens/**"};
http
.csrf().disable()
.exceptionHandling().authenticationEntryPoint(authenticationExceptionEntryPoint())
.and()
.authorizeRequests()
.expressionHandler(webExpressionHandler())
.antMatcher(PREFIX + "/**")
.authorizeRequests()
.antMatchers(URLsToBeProtectedAsWebUi).hasRole(UserManagement.RoleEnum.WEBUI.getRoleString())
.and()
.addFilterBefore(authenticationTokenProcessingFilter(), BasicAuthenticationFilter.class)
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
问题是,如果我使用 WEB UI 用户的令牌调用 PREFIX + "/auth/tokens/**
WS,一切正常,但如果我使用 ADMIN 用户的令牌,那么我会得到一个403 access denied
响应,但我希望管理员应该被允许使用该服务,因为他在角色层次结构中更高。
我做错了什么?
谢谢
已解决。错误在数据库中:角色被错误地分配给了用户
我正在我的 Web 应用程序中配置对我的 REST WS 的角色访问,我想实现一个角色层次结构。 我定义了这个bean
@Bean
public RoleHierarchyImpl roleHierarchy() {
RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl();
roleHierarchy.setHierarchy(
UserManagement.RoleEnum.ADMIN.getRoleString() + " > " + UserManagement.RoleEnum.WEBUI.getRoleString()
);
return roleHierarchy;
}
private SecurityExpressionHandler<FilterInvocation> webExpressionHandler() {
DefaultWebSecurityExpressionHandler defaultWebSecurityExpressionHandler = new DefaultWebSecurityExpressionHandler();
defaultWebSecurityExpressionHandler.setRoleHierarchy(roleHierarchy());
return defaultWebSecurityExpressionHandler;
}
然后在我的 SecurityConfiguration.configure(HttpSecurity http)
方法中我写:
String[] URLsToBeProtectedAsWebUi = {PREFIX + "/auth/tokens/**"};
http
.csrf().disable()
.exceptionHandling().authenticationEntryPoint(authenticationExceptionEntryPoint())
.and()
.authorizeRequests()
.expressionHandler(webExpressionHandler())
.antMatcher(PREFIX + "/**")
.authorizeRequests()
.antMatchers(URLsToBeProtectedAsWebUi).hasRole(UserManagement.RoleEnum.WEBUI.getRoleString())
.and()
.addFilterBefore(authenticationTokenProcessingFilter(), BasicAuthenticationFilter.class)
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
问题是,如果我使用 WEB UI 用户的令牌调用 PREFIX + "/auth/tokens/**
WS,一切正常,但如果我使用 ADMIN 用户的令牌,那么我会得到一个403 access denied
响应,但我希望管理员应该被允许使用该服务,因为他在角色层次结构中更高。
我做错了什么?
谢谢
已解决。错误在数据库中:角色被错误地分配给了用户