【问题标题】:Spring Security remove RoleVoter prefixSpring Security 移除 RoleVoter 前缀
【发布时间】:2014-03-04 09:53:15
【问题描述】:

在我正在工作的项目中,我们根据角色 ID 而不是角色描述进行身份验证,并且此映射存储在数据库中。

我的问题是,如何删除 Spring Security 的 RoleVoter 前缀以实现上述设计?

【问题讨论】:

    标签: spring spring-security


    【解决方案1】:

    Spring security RoleVoter需要一个前缀来区分作为角色的授权权限,有关更多详细信息,请参阅此answer

    如果您想更改此设置,您可以随时提供自己的自定义 AccessDecisionManager and configure it with a customRoleVoter`。

    这是此类自定义访问决策管理器的示例:

    public class MyAccessDecisionManager  extends AffirmativeBased {
    
    
        public MyAccessDecisionManager() {
            super();
            List<AccessDecisionVoter> decisionVoters = new ArrayList<AccessDecisionVoter>();
            RoleVoter roleVoter = new MyCustomRoleVoter();
            decisionVoters.add(roleVoter);
            AuthenticatedVoter authenticatedVoter = new AuthenticatedVoter();
            decisionVoters.add(authenticatedVoter);
            setDecisionVoters(decisionVoters);
    
        }
    

    并且使用它来代替默认的访问决策管理器:

    <bean id="myAccessDecisionManager" class="full.package.name.MyAccessDecisionManager" />
    
    <security:http access-decision-manager-ref="myAccessDecisionManager">
        ...
    </security:http>
    

    【讨论】:

    • spring-security.xml中如何配置?
    • 构造函数 AffirmativeBased() 在 spring security 4.1.3 中未定义
    【解决方案2】:

    可能有人需要基于 Web 应用程序的注释来决定

    @Configuration
    @EnableGlobalMethodSecurity(securedEnabled = true)
    protected static class GlobalSecurityConfig extends GlobalMethodSecurityConfiguration {
        @Override
        protected AccessDecisionManager accessDecisionManager() {
            AffirmativeBased accessDecisionManager = (AffirmativeBased)super.accessDecisionManager();
            for(AccessDecisionVoter voter: accessDecisionManager.getDecisionVoters()){
                if(voter instanceof RoleVoter){
                    // do what you whant
                }
            }
            return accessDecisionManager;
        }
    }
    
    
    
    @Configuration
    @EnableWebSecurity
    protected static class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
        @Bean
        @Primary
        public AccessDecisionManager accessDecisionManager() {
            List<AccessDecisionVoter<? extends Object>> decisionVoters = Arrays.asList(
                    new WebExpressionVoter(),
                    new RoleVoter(),
                    new AuthenticatedVoter()
            );
            return new AffirmativeBased(decisionVoters);
        }
    }
    

    【讨论】:

      【解决方案3】:

      从 Spring 4 开始,将 hasRole("X") 替换为 hasAuthority("X")

      https://docs.spring.io/autorepo/docs/spring-security/4.0.0.RC1/reference/html/el-access.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-09
        • 1970-01-01
        • 2015-08-21
        • 2016-11-03
        • 2018-09-12
        • 2020-06-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多