【问题标题】:Spring security AccessDecisionManager: roleVoter, Acl VoterSpring security AccessDecisionManager:roleVoter、Acl Voter
【发布时间】:2014-05-19 09:31:04
【问题描述】:

我正在尝试使用 Java Config 设置 Spring Security 3.2 项目,而根本不使用 XML。 我想要一个支持 RoleHierarchyVoter 和 AclEntryVoters 的访问决策投票器。这是我正在使用的配置:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
        @Autowired
        private AclEntryVoter aclUpdatePropertyVoter;

        @Autowired
        private AclEntryVoter aclDeletePropertyVoter;

        @Override
        protected void configure(HttpSecurity http) throws Exception {
                http
                        .formLogin()
                        .and()
                        .logout()
                            .deleteCookies("JSESSIONID")
                            .logoutSuccessUrl("/")
                        .and()
                        .authorizeRequests()
                                 .accessDecisionManager(accessDecisionManager()) 
                                .antMatchers("/login", "/signup/email", "/logout",                 "/search", "/").permitAll()
                                .anyRequest().authenticated();

}


@Bean
public RoleHierarchyVoter roleVoter() {
        RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl();
        roleHierarchy.setHierarchy("ROLE_USER > ROLE_ANONYMOUS");
        RoleHierarchyVoter roleHierarchyVoter = new RoleHierarchyVoter(roleHierarchy);
        return roleHierarchyVoter;
}

@Bean
public AffirmativeBased accessDecisionManager() {
        List<AccessDecisionVoter> decisionVoters = new ArrayList<>();
        WebExpressionVoter webExpressionVoter = new WebExpressionVoter();
        decisionVoters.add(webExpressionVoter);
        decisionVoters.add(roleVoter());
        decisionVoters.add(aclDeletePropertyVoter);
        decisionVoters.add(aclUpdatePropertyVoter);

        AffirmativeBased affirmativeBased = new AffirmativeBased(decisionVoters);
        return affirmativeBased;
}



}

但是,当应用程序初始化时,我得到以下异常:

我得到了例外:

java.lang.IllegalArgumentException: AccessDecisionManager does not support secure object class: class org.springframework.security.web.FilterInvocation

在调试代码时,我可以看到调用 AbstractAccessDecisionManager 并执行以下代码:

public boolean supports(Class<?> clazz) {
    for (AccessDecisionVoter voter : this.decisionVoters) {
        if (!voter.supports(clazz)) {
            return false;
        }
    }

    return true;
}

RoleHierarchyVoter 支持 FilterInvocation,但是 AclEntryVoters 无法通过它。我在配置中做错了什么?如何设置项目以支持两种类型的选民?提前非常感谢

【问题讨论】:

    标签: spring spring-security


    【解决方案1】:

    正如您所观察到的,acl 投票者不支持过滤器调用,因为它们旨在检查安全方法,而不是 Web 请求。

    您应该配置一个单独的AccessDecisionManager 以用于您的方法安全性,并将 acl 投票者添加到其中。

    【讨论】:

    • 非常感谢您的回答。
    猜你喜欢
    • 1970-01-01
    • 2019-07-18
    • 2014-02-15
    • 1970-01-01
    • 1970-01-01
    • 2018-12-21
    • 2013-02-25
    • 2010-12-27
    • 2016-09-06
    相关资源
    最近更新 更多