试图在spring安全性中配置自定义权限评估程序的循环引用

时间:2015-12-24 14:02:59

标签: spring-security

我正在尝试配置自定义权限评估程序,但每当应用程序启动时,它都会抱怨循环引用。

配置代码为:

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true, proxyTargetClass = true)
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {
    private static Logger logger = LogManager.getLogger(MethodSecurityConfig.class.getName());

    @Autowired
    DataSource dataSource;

    @Autowired
    Environment env;

    @Autowired
    AuthenticationManager auth;

    public MethodSecurityConfig() {
        logger.debug("Loading method security config.");
    }


    @Override
    protected AuthenticationManager authenticationManager() throws Exception {
        return auth;
    }

    /**
     * Override to set up the custom expression handler.
     * @return The custom expression handler
     */
    @Override
    protected MethodSecurityExpressionHandler createExpressionHandler() {
        return expressionHandler();
    }

    /**
     * Defines a custom permission evaluator to evaluate the access permissions for Spring security.
     * @return The default expression handler configured with a custom permission evaluator.
     */
    @Bean
    public DefaultMethodSecurityExpressionHandler expressionHandler(){
        DefaultMethodSecurityExpressionHandler handler = new DefaultMethodSecurityExpressionHandler();
        handler.setPermissionEvaluator(permissionEvaluator());
        return handler;
    }

    /**
     * Custom implementation of a permission evaluator
     * @return An instance of {@link BasePermissionEvaluator}
     */
    @Bean
    public PermissionEvaluator permissionEvaluator() {
       return new BasePermissionEvaluator();
    }

}

当应用启动时,会发生此异常:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'methodSecurityConfig': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire method: public void org.springframework.security.config.annotation.method.configuration.GlobalMethodSecurityConfiguration.setPermissionEvaluator(java.util.List); nested exception is org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'permissionEvaluator': Requested bean is currently in creation: Is there an unresolvable circular reference?
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334) ~[AutowiredAnnotationBeanPostProcessor.class:4.2.1.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214) ~[AbstractAutowireCapableBeanFactory.class:4.2.1.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543) ~[AbstractAutowireCapableBeanFactory.class:4.2.1.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) ~[AbstractAutowireCapableBeanFactory.class:4.2.1.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:305) ~[AbstractBeanFactory$1.class:4.2.1.RELEASE]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[DefaultSingletonBeanRegistry.class:4.2.1.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:301) ~[AbstractBeanFactory.class:4.2.1.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:196) ~[AbstractBeanFactory.class:4.2.1.RELEASE]
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:368) ~[ConstructorResolver.class:4.2.1.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(A

我在这里做错了什么?我尝试了添加AuthenticationManager等各种功能。还有其他我需要覆盖的东西吗?

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题。在我的情况下,原因是有另一个具有@EnableGlobalMethodSecurity注释的安全配置类。删除该注释解决了这个问题。

有两个安全配置类的原因描述为here

据我所知,当Spring第一次处理另一个配置类时会发生这种情况,因为@EnableGlobalMethodSecurity permissionEvaluator 并且在这个配置类处理的时候及之后注册了类似的bean我们得到了这个错误。

看起来这个行为是任意的,取决于首先根据类路径排序处理哪个配置类。