如何为Spring Authorization Server自动装配指定的PasswordEncoder Bean
方案一:将目标编码器设为Primary Bean
在v1Encoder的Bean定义上添加@Primary注解,让Spring自动装配PasswordEncoder类型时优先选择该Bean:
@Bean("v1-encoder") @Primary fun v1Encoder(): PasswordEncoder { return V1PasswordEncoder() } @Bean("v0-encoder") fun v0Encoder(): PasswordEncoder { return V0PasswordEncoder() }
方案二:在授权服务器配置中手动指定编码器
修改OAuth2ServerSecurityConfig,显式配置授权服务器使用v1-encoder:
@Configuration class OAuth2ServerSecurityConfig { @Autowired @Qualifier("v1-encoder") private lateinit var v1PasswordEncoder: PasswordEncoder @Bean @Order(1) fun authorizationServerSecurityFilterChain(http: HttpSecurity): SecurityFilterChain { OAuth2AuthorizationServerConfiguration.applyDefaultSecurity(http) http.getConfigurer(OAuth2AuthorizationServerConfigurer::class.java) .oidc(Customizer.withDefaults()) // 为客户端认证指定编码器 .clientAuthentication { clientAuth -> clientAuth.passwordEncoder(v1PasswordEncoder) } return http.build() } @Bean fun authorizationServerSettings(): AuthorizationServerSettings { return AuthorizationServerSettings.builder().build() } @Bean fun registeredClientRepository(): RegisteredClientRepository { val registeredClient = RegisteredClient.withId(UUID.randomUUID().toString()) .clientId("client") .clientSecret("{bcrypt}secret") .authorizationGrantType(AuthorizationGrantType.CLIENT_CREDENTIALS) .build() return InMemoryRegisteredClientRepository(registeredClient) } }
方案三:定义专门供授权服务器使用的编码器Bean
通过包装v1-encoder,创建一个Spring能自动识别的全局可选编码器:
@Bean fun authorizationServerPasswordEncoder(@Qualifier("v1-encoder") encoder: PasswordEncoder): PasswordEncoder { return encoder }
授权服务器调用OAuth2ConfigurerUtils.getOptionalBean时,会自动拾取这个Bean。
内容的提问来源于stack exchange,提问作者Holm
相关产品推荐
相关产品推荐

