gpt4 book ai didi

java - 入门级自动配置Bean始终优先于自定义自动配置Bean

转载 作者:行者123 更新时间:2023-12-03 17:46:05 25 4
gpt4 key购买 nike

我正在尝试制作一个自定义的弹簧启动启动器,该启动器将由多个项目用于通过Azure AD进行身份验证。已经设置了所有Azure AD配置,并且使用所有设置进行硬编码的单个项目都可以与Azure AD一起正常工作。现在,我正在尝试将这些设置移动到自定义的Spring Boot启动程序中,以便多个项目可以使用它。它在大多数情况下都起作用,除了一件事:移动自定义AADAppRoleStatelessAuthenticationFilter的bean配置。如果我将自定义实现(CustomAADAppRoleStatelessAuthFilter)保留在实际的实现项目中,则一切正常,并且仅创建CustomAADAppRoleStatelessAuthFilter,但是一旦将其移入自定义启动程序中,我只会得到AADAppRoleStatelessAuthenticationFilter

请注意,我的CustomAADAppRoleStatelessAuthFilter扩展了初学者的
AADAppRoleStatelessAuthenticationFilter

azure-spring-boot项目(https://github.com/microsoft/azure-spring-boot/blob/master/azure-spring-boot/src/main/java/com/microsoft/azure/spring/autoconfigure/aad/AADAuthenticationFilterAutoConfiguration.java)中AADAppRoleStatelessAuthenticationFilter的自动配置为:

@Bean
@ConditionalOnMissingBean(AADAppRoleStatelessAuthenticationFilter.class)
@ConditionalOnProperty(prefix = PROPERTY_PREFIX, value = PROPERTY_SESSION_STATELESS, havingValue = "true")
public AADAppRoleStatelessAuthenticationFilter azureADStatelessAuthFilter(ResourceRetriever resourceRetriever) {
//bean details omitted
}


我的自定义自动配置应替代以上内容,如下所示:

@Bean
@ConditionalOnMissingBean(AADAppRoleStatelessAuthenticationFilter.class)
@ConditionalOnProperty(prefix = PROPERTY_PREFIX, value = PROPERTY_SESSION_STATELESS, havingValue = "true")
public AADAppRoleStatelessAuthenticationFilter customAADAppRoleStatelessAuthFilter(
ResourceRetriever resourceRetriever) {
return new CustomAADAppRoleStatelessAuthenticationFilter(/*details omitted*/);
}


@AutoConfigureBefore(AADAuthenticationFilterAutoConfiguration.class)无效。

另外,如果我将自定义bean的条件更改为子类型( @ConditionalOnMissingBean(CustomAADAppRoleStatelessAuthFilter.class)),则会创建两种类型,并且可以自动连接 CustomAwareAADAppRoleStatelessAuthFilter并将其放在我的 WebSecurityConfigurerAdapter中,但仍然无法正常工作。我调试了东西,发现 CustomAADAppRoleStatelessAuthFilter是我的Spring安全性过滤器链中唯一的 ADAppRoleStatelessAuthenticationFilter类型的bean,但是一旦“附加过滤器链的末端”完成并且“原始链继续进行”,我发现 ADAppRoleStatelessAuthenticationFilter已触发!当然,这会引发错误,因为我的 CustomAADAppRoleStatelessAuthFilter已经完成了自定义 UserPrincipal的工作。我无法弄清楚 ADAppRoleStatelessAuthenticationFilter会被添加到任何过滤器链中的哪个位置,即使我用 CustomAADAppRoleStatelessAuthFilter标记了 @Primary bean,仍将使用启动器 ADAppRoleStatelessAuthenticationFilter

唯一有效的“解决方案”是在实际的实施项目中定义 CustomAADAppRoleStatelessAuthFilter而不是自定义的入门项目,或者在我的实际实施项目的 AADAuthenticationFilterAutoConfiguration批注中排除 @SpringBootApplication(甚至不排除该属性方式有效)。

有没有办法让 AADAuthenticationFilterAutoConfigurationADAppRoleStatelessAuthenticationFilter bean定义退后? “在具有我的 @AutoConfigureBefore(AADAuthenticationFilterAutoConfiguration.class)定义的自定义自动配置类上,导致 CustomAADAppRoleStatelessAuthFilter无效,并且将所有正在实施的项目明确排除在 AADAuthenticationFilterAutoConfiguration之外并不是最理想的解决方案(尽管至少使用该解决方案他们不这样做)并非所有人都需要为 CustomAADAppRoleStatelessAuthFilter声明自己的bean定义)。

最佳答案

您是否尝试过使用@Order并为自定义bean分配更高的优先级。默认情况下,所有bean的优先级最低(Ordered.LOWEST_PRECEDENCE)都输给其他任何指定的订单值。

@Order(Ordered.LOWEST_PRECEDENCE - 1)
@Bean
@ConditionalOnMissingBean(AADAppRoleStatelessAuthenticationFilter.class)
@ConditionalOnProperty(prefix = PROPERTY_PREFIX, value = PROPERTY_SESSION_STATELESS, havingValue = "true")
public AADAppRoleStatelessAuthenticationFilter customAADAppRoleStatelessAuthFilter(
ResourceRetriever resourceRetriever) {
return new CustomAADAppRoleStatelessAuthenticationFilter(/*details omitted*/);
}


您可以尝试像上面提到的那样放置 @Order(Ordered.LOWEST_PRECEDENCE - 1)吗?然后,您的bean应该优先于另一个。

关于java - 入门级自动配置Bean始终优先于自定义自动配置Bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59777396/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com