使用带有HttpSecurity的自定义AccessDecisionManager addFilterBefore不起作用

时间:2017-04-28 15:56:49

标签: java spring-boot spring-security

添加过滤器或其他方式时,不会调用自定义AccessDecisionManager。理想情况下要设置filterBefore和自定义AccessDecisionManager(使用SpringBoot 1.5.2发布版本)。或者想在默认的RoleVoter上调用setRolePrefix。还添加了SpringRolesPrefixPostProcessor,如Spring 3到4迁移指南的第8.3节所述,但仍然RoleVoter查找“ROLE_”前缀

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    AuthenticationFilter authenticationFilter;

    @Bean
    public AccessDecisionManager accessDecisionManager() {
        List<AccessDecisionVoter<? extends Object>> decisionVoters 
          = Arrays.asList(
            new WebExpressionVoter(),
            new RoleVoter(),
            new AuthenticatedVoter());
        return new AffirmativeBased(decisionVoters);
    }
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
        .authorizeRequests().accessDecisionManager(accessDecisionManager())
        .anyRequest().authenticated(); 

        http.addFilterBefore(authenticationFilter, BasicAuthenticationFilter.class);
    }
}

1 个答案:

答案 0 :(得分:0)

似乎您期望AccessDecisionManager被调用来授予/拒绝对安全方法的访问。

尝试以下操作:

  1. @EnableGlobalMethodSecurity中删除SecurityConfig注释。

  2. 将注释移动到扩展GlobalMethodSecurityConfiguration的另一个配置类。

例如:

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {
    @Autowired
    AccessDecisionManager accessDecisionManager;

    @Override
    protected AccessDecisionManager accessDecisionManager() {
        return this.accessDecisionManager;
    }

}

说明:

GlobalMethodSecurityConfiguration负责创建方法拦截器,并且不会寻找要使用的AccessDecisionManager bean。必须通过重写方法提供它。

注意: 默认情况下,使用两个 AccessDecisionManagers:一个用于过滤器(由AbstractInterceptUrlConfigurer创建),另一个用于保护方法(由GlobalMethodSecurityConfiguration创建)。

  

或者要在默认RoleVoter上调用setRolePrefix

您可以执行此操作,而无需触摸默认的AccessDecisionManager

@Bean
public GrantedAuthorityDefaults grantedAuthorityDefaults() {
    return new GrantedAuthorityDefaults("");
}

这会将两者默认""上的角色前缀设置为AccessDecisionManagers