gpt4 book ai didi

Spring Boot + Spring Security + 分层角色

转载 作者:IT老高 更新时间:2023-10-28 13:46:28 25 4
gpt4 key购买 nike

我试图在我的 Spring Boot 应用程序中设置分层角色,但没有成功。我已经完成了互联网上不同地方所说的所有内容。但是没有一个我能够解决这个问题。

这是我的 SecurityConfig 类的代码。当我使用具有 ROLE_ADMIN 的用户登录应用程序时,它应该能够从“/users”检索数据,但目前我收到拒绝访问异常。如果用户拥有 ROLE_USER 凭据,则可以正常工作。谁能帮我弄清楚是什么失败了?提前致谢。

@Configuration
@EnableWebMvcSecurity
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

@Autowired
private SigpaUserDetailsService userDetailsService;

@Bean
public RoleHierarchyImpl roleHierarchy() {
RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl();
roleHierarchy.setHierarchy("ROLE_ADMIN > ROLE_USER");
return roleHierarchy;
}

@Bean
public RoleHierarchyVoter roleVoter() {
return new RoleHierarchyVoter(roleHierarchy());
}

@Bean
public DefaultWebSecurityExpressionHandler expressionHandler(){
DefaultWebSecurityExpressionHandler expressionHandler = new DefaultWebSecurityExpressionHandler();
expressionHandler.setRoleHierarchy(roleHierarchy());
return expressionHandler;
}

@Bean
@SuppressWarnings(value = { "rawtypes" })
public AffirmativeBased accessDecisionManager() {
List<AccessDecisionVoter> decisionVoters = new ArrayList<AccessDecisionVoter>();
WebExpressionVoter webExpressionVoter = new WebExpressionVoter();
webExpressionVoter.setExpressionHandler(expressionHandler());
decisionVoters.add(webExpressionVoter);
decisionVoters.add(roleVoter());
return new AffirmativeBased(decisionVoters);
}

@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.accessDecisionManager(accessDecisionManager())
.expressionHandler(expressionHandler())
.antMatchers("/users/**")
.access("hasRole('ROLE_USER')")
.anyRequest().authenticated();
http
.formLogin()
.loginPage("/login").permitAll()
.and()
.logout()
.permitAll();
}

@Override
protected void configure(AuthenticationManagerBuilder registry)
throws Exception {
registry.userDetailsService(userDetailsService);
}
}

更新:这是根据您的建议更新的代码,但仍然无法正常工作。

最佳答案

我刚刚完成了这些设置,所以现在肯定会让你开始运行。这是交易:

你引入了这个注释 @EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true) 但没有显示任何代码来使用 Pre/Post Authorize/Filter 所以我不知道你是否真的需要它。

  1. 如果您不需要该类/方法级别的安全/过滤,那么您需要做的就是:

    @Bean
    public RoleHierarchyImpl roleHierarchy() {
    RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl();
    roleHierarchy.setHierarchy("ROLE_ADMIN > ROLE_USER");
    return roleHierarchy;
    }

        private SecurityExpressionHandler<FilterInvocation> webExpressionHandler() {
DefaultWebSecurityExpressionHandler defaultWebSecurityExpressionHandler = new DefaultWebSecurityExpressionHandler();
defaultWebSecurityExpressionHandler.setRoleHierarchy(roleHierarchy());
return defaultWebSecurityExpressionHandler;
}

http
.authorizeRequests()
.expressionHandler(webExpressionHandler())

如果您只需要引入角色层次结构,则不必使用自己的 accessDecisionManager 覆盖。

  1. 如果您还需要类/方法级别的安全性,即在您的方法/类上使用 PreAuthorize、PostAuthorize、PreFilter、PostFilter,那么还要在您的类路径中创建这样的 @Configuration(以及从 GlobalMethodSecurityConfig 类中删除 @EnableGlobalMethodSecurity 注释):

    @Configuration
    @EnableGlobalMethodSecurity(prePostEnabled=true)
    public class AnyNameYouLike extends GlobalMethodSecurityConfiguration {

    @Resource
    private RoleHierarchy roleHierarchy;

    @Override
    protected MethodSecurityExpressionHandler createExpressionHandler() {
    DefaultMethodSecurityExpressionHandler expressionHandler = (DefaultMethodSecurityExpressionHandler) super.createExpressionHandler();
    expressionHandler.setRoleHierarchy(roleHierarchy);
    return expressionHandler;
    }

    }

我会给这个新类命名为 GlobalMethodSecurityConfig 并将您当前的 GlobalMethodSecurityConfig 类更改为 WebSecurityConfig 或其他东西以反射(reflect)它是 Web 层的安全设置。

我在 webSecurityConfig 中定义了 RoleHierarchy bean,并在 globalMethodSecurityConfig 中注入(inject)/使用它,但是您可以按照自己喜欢的方式进行操作,只要您没有不必要地创建 2 个 bean。

希望这会有所帮助。

关于Spring Boot + Spring Security + 分层角色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26661192/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com