当前位置: 首页 > 知识库问答 >
问题:

Spring BootSpring Security分层角色

郎成弘
2023-03-14

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

这是我的SecurityConfig类的代码。当我用ROLE_ADMIN用户登录应用程序时,它应该能够从“/用户”检索数据,但目前我收到一个拒绝访问异常。如果用户有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);
    }
}

更新:这是根据您的建议更新的代码,但仍然不起作用。

共有3个答案

宗政财
2023-03-14

您必须在方法安全表达式处理程序上设置角色层次结构:

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public static class GlobalMethodSecurityConfig extends GlobalMethodSecurityConfiguration {
    @Autowired
    private RoleHierarchy roleHierarchy;

    @Override
    protected MethodSecurityExpressionHandler createExpressionHandler() {
        final DefaultMethodSecurityExpressionHandler handler = new DefaultMethodSecurityExpressionHandler();
        handler.setRoleHierarchy(this.roleHierarchy);
        return handler;
    }
}

有关更多信息,请查看Javadoc中的@EnableGlobalMethodSecurity。特别注意:为了确定设置,扩展GlobalMethodSecurity配置的类中仍然必须包含EnableGlobalMethodSecurity。

甄佐
2023-03-14

您需要在web上设置角色层次结构。比如:

DefaultWebSecurityExpressionHandler expressionHandler = new DefaultWebSecurityExpressionHandler();
expressionHandler.setRoleHierarchy(roleHierarchy);
webExpressionVoter.setExpressionHandler(expressionHandler);

更新:您也可以尝试像这样设置上面的表达式处理程序:

http
    .authorizeRequests()
    .expressionHandler(expressionHandler)
    ...
徐飞尘
2023-03-14

我刚刚经历了这些设置,所以现在肯定会让你开始跑步。交易是这样的:

你带来了这个注解@EnableGlobalMethodSecurity(securedEnabled=true,Preprestenabled=true),但没有显示任何使用预/后授权/筛选的代码,所以我不知道你是否真的需要它。

>

@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进行覆盖。

如果您还需要类/方法级别的安全性,即在您的方法/类上使用PreAuthoriza, PostAuthoriza, PreFilter, PostFilter,那么也可以在类路径中创建这样的@Configance(并从GlobalomeodSecurityConfig类中删除@EnableGlobalmetodSecurity注释):

@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或其他内容,以反映它是web层的安全设置。

我在webSecurityConfig中定义了RoleHiLevel ybean,并将其注入/使用到globalomeodSecurityConfig中,但是您可以以任何您喜欢的方式进行,只要您不创建2个bean就行了。

希望这有帮助。

 类似资料:
  • 我试图在Spring security中实现分层角色,并根据Spring源代码文档在xml文件中添加了以下配置。 我已经尝试了上面的行,但是当ROLE_ADMIN试图访问分配给role_basic的url时,我被拒绝访问。我还需要添加更多的东西吗。我在Spring网站上除了那些线之外,什么也没有找到。此外,如果您知道分层角色的任何良好实现,请务必提及它们。

  • 我添加了基于方法的安全性和角色层次结构。我在构建过程中不断遇到以下异常: 组织。springframework。豆。BeanInstationException:未能实例化[org.springframework.web.servlet.HandlerMapping]:工厂方法“defaultServletHandlerMapping”引发异常;嵌套的例外是java。lang.IllegalArg

  • 问题内容: 由于使用了Gentoo,经常发生这样的情况,即在更新程序链接到旧版本的库之后。通常,revdep- rebuild有助于解决该问题,但是这一次它依赖于python库,因此不会使用。 是否有“分层”变体向我显示哪个共享库取决于另一个共享库?大多数时候,库和可执行文件仅与少数几个其他共享库链接,而这些共享库又与少数几个共享库链接,从而使库依赖性成为一个大列表。我想知道我必须使用升级的另一个

  • 问题内容: 我希望我能够解释困扰我的问题。我有以下分层数据集(这只是34K记录的子集) 这是树的代表 我需要的是清单的所有记录,带有exam = N和潜在的extest =’J’记录,可以嵌套。 给我 但是我需要的是 当我遇到EXAM =’N’记录时,需要停止运行。 我需要类似“停止于”子句的内容。 如何才能做到这一点? 问题答案: 罗伯特 您可以通过在connect by子句中添加“ exam

  • 您可在添加员工是分配角色,具体请详见【如何导入员工】 除此之外,您可在【角色】页面通过“管理成员”进行角色分配。(主管,初始管理员除外) 分配角色 点击角色右侧“管理成员”按钮(主管、初始超管除外) 您可在此添加或移除角色成员。 设置主管 您可在部门或项目模块进行主管设置,具体请详见【通过部门、项目管理员工】 设置初始管理员 初始管理员为默认角色,为企业唯一,若需修改,请详见【如何移交初始管理员】

  • 问题内容: 我希望能够以一定顺序返回预输入项。例如,搜索应返回: 1)以搜索词para开头的建议应在顶部并按字母顺序排列 2)其余项目应按字母顺序显示在下方 Elasticsearch有可能吗? 更新资料 如果我希望输出像这样: 因此,所有包含前缀的术语都位于顶部,其他所有术语均按字母顺序排列。 问题答案: 这是我的建议(同样,您需要启用脚本): 更新 对于您的更新问题, 即使我希望再发表一则文章