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

尝试在spring security中配置自定义权限计算器的循环引用

沈华皓
2023-03-14

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

配置代码为:

@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

共有1个答案

印晋
2023-03-14

我也面临过同样的问题。在我的例子中,原因是有另一个具有@EnableGlobalMethodSecurity注释的安全配置类。删除该注释解决了这个问题。

这里描述了使用两个安全配置类的原因。

根据我的理解,这是在Spring第一次处理另一个配置类时发生的,因为@EnableGlobalMethodSecuritypermissionEvaluator和类似的bean是在那一次注册的,后来在处理这个配置类时,我们得到了这个错误。

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

 类似资料:
  • 我试图用while循环计算多个数字的和。当输入负数时,应打印数字之和。当我运行代码时,它所做的就是打印最后输入的正数。以下是当前的非工作代码:

  • 我真的不知道这个问题。。。 如果数字不正确,块将捕获异常,当我输入-1或0时,它将捕获异常并要求我再次输入数字。。。但如果我键入类似asdasd的内容,它将运行一个无限循环。

  • 依赖项:Spring Boot 1.1.5。释放,Spring4.0.6。Spring安全释放装置3.2.4。释放 问题:我正在创建一个自定义过滤器,该过滤器基于请求中的令牌查询提供者以验证用户。这里有自定义筛选器代码和配置。正如你所看到的,我已经尽可能地禁用了以查明问题。启用调试显示 另一件事是日志告诉我用户已通过身份验证。 当查询应用程序时,会发生无限循环并最终返回请求,curl说它无法遵循那

  • 我在学习python的时候正在制作一个计算器程序,我在高中时学过Java,还不知道任何高级python函数,所以尽量不要使用太高级的东西,但让我们来解决我的问题。对不起,如果这个问题没有组织好,我从来没有在这里发布过。整个程序将位于底部。 我卡住的地方是,我让用户输入他们想要使用的操作符,然后它要求数字1和数字2。如果用户在任何时候输入“退出”或“停止”,程序就会退出,对于操作员部分,它会退出并显

  • 本文向大家介绍Android权限控制之自定义权限,包括了Android权限控制之自定义权限的使用技巧和注意事项,需要的朋友参考一下 天哪,这篇文章终于说道如何自定义权限了,左盼右盼,其实这个自定义权限相当easy。为了方便叙述,我这边会用到两个app作为例子示范。 Permission App: used to define a new permission 这个作为定义权限的App,我称之为Pe