AEv*_*ans 5 java azure-active-directory spring-boot spring-boot-starter
我正在尝试制作一个自定义 Spring Boot 启动器,多个项目将使用它来对 Azure AD 进行身份验证。已设置所有 Azure AD 配置,并且使用所有设置硬编码的单个项目也可以与 Azure AD 配合使用。现在我正在尝试将这些设置移动到自定义 Spring Boot 启动器中,以便多个项目可以使用它。它在大多数情况下都有效,除了一件事:移动自定义AADAppRoleStatelessAuthenticationFilter. 如果我将自定义实现 ( CustomAADAppRoleStatelessAuthFilter) 硬编码在实际实现项目中,则一切正常并且仅CustomAADAppRoleStatelessAuthFilter创建,但是一旦我将其移入自定义启动器,我只会得到AADAppRoleStatelessAuthenticationFilter。
请注意,我的CustomAADAppRoleStatelessAuthFilter扩展了启动器的
AADAppRoleStatelessAuthenticationFilter.
AADAppRoleStatelessAuthenticationFilterazure-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 ) 是:
@Bean
@ConditionalOnMissingBean(AADAppRoleStatelessAuthenticationFilter.class)
@ConditionalOnProperty(prefix = PROPERTY_PREFIX, value = PROPERTY_SESSION_STATELESS, havingValue = "true")
public AADAppRoleStatelessAuthenticationFilter azureADStatelessAuthFilter(ResourceRetriever resourceRetriever) {
//bean details omitted
}
Run Code Online (Sandbox Code Playgroud)
我应该替换上述内容的自定义自动配置如下:
@Bean
@ConditionalOnMissingBean(AADAppRoleStatelessAuthenticationFilter.class)
@ConditionalOnProperty(prefix = PROPERTY_PREFIX, value = PROPERTY_SESSION_STATELESS, havingValue = "true")
public AADAppRoleStatelessAuthenticationFilter customAADAppRoleStatelessAuthFilter(
ResourceRetriever resourceRetriever) {
return new CustomAADAppRoleStatelessAuthenticationFilter(/*details omitted*/);
}
Run Code Online (Sandbox Code Playgroud)
没有多少@AutoConfigureBefore(AADAuthenticationFilterAutoConfiguration.class)作品。
此外,如果我将自定义 bean 上的条件更改为子类型 ( @ConditionalOnMissingBean(CustomAADAppRoleStatelessAuthFilter.class)),则会创建两种类型,并且我可以自动装配 myCustomAwareAADAppRoleStatelessAuthFilter并将其放入 my 中WebSecurityConfigurerAdapter,但仍然无法正常工作。我调试了一些东西,发现它CustomAADAppRoleStatelessAuthFilter是ADAppRoleStatelessAuthenticationFilter我的 spring 安全过滤器链中唯一的该类型的bean,但是一旦“附加过滤器链的末端”完成并且“原始链继续”,我发现它ADAppRoleStatelessAuthenticationFilter已被触发!当然它会抛出一个错误,因为我CustomAADAppRoleStatelessAuthFilter已经做了一些事情来自定义UserPrincipal. 我无法弄清楚 在哪里ADAppRoleStatelessAuthenticationFilter被添加到任何过滤器链,即使我用 标记我的CustomAADAppRoleStatelessAuthFilterbean @Primary,ADAppRoleStatelessAuthenticationFilter仍然会使用starter 。
唯一有效的“解决方案”是CustomAADAppRoleStatelessAuthFilter在实际实施项目中定义而不是自定义启动项目,或者AADAuthenticationFilterAutoConfiguration在我的实际实施项目的@SpringBootApplication注释中排除(甚至不排除基于属性的方式工作)。
有没有办法让AADAuthenticationFilterAutoConfigurations ADAppRoleStatelessAuthenticationFilterbean 定义退后?因为@AutoConfigureBefore(AADAuthenticationFilterAutoConfiguration.class)在我定义的自定义自动配置类上CustomAADAppRoleStatelessAuthFilter不起作用,并且明确排除所有实施项目AADAuthenticationFilterAutoConfiguration并不是最理想的解决方案(尽管至少在该解决方案中,他们并不都需要声明自己的 bean的定义CustomAADAppRoleStatelessAuthFilter)。
| 归档时间: |
|
| 查看次数: |
540 次 |
| 最近记录: |