如何扩展其他Jar包中的Spring Security配置并新增额外认证用户
Spring Security 不修改公共依赖扩展内存用户解决方案
以下两种方案均无需修改公共依赖包源码,可直接在第二个项目中实现:
方案1:继承原有配置类+排除原有配置实例化(最简洁,复用全部原有安全规则)
- 在第二个项目的启动类上通过组件扫描排除公共包的原有配置类,避免重复注册过滤器链:
@SpringBootApplication @ComponentScan(excludeFilters = @ComponentScan.Filter( type = FilterType.ASSIGNABLE_TYPE, classes = AuthConfiguration.class )) public class YourSecondProjectApplication { public static void main(String[] args) { SpringApplication.run(YourSecondProjectApplication.class, args); } }
- 自定义配置类继承公共包的
AuthConfiguration,重写用户配置方法追加新用户:
@Configuration @EnableWebSecurity public class ExtendedAuthConfiguration extends AuthConfiguration { @Override protected void configure(AuthenticationManagerBuilder authManagerBuilder) throws Exception { // 加载原有公共配置定义的FOO用户 super.configure(authManagerBuilder); // 追加新增用户 User.UserBuilder users = User.withDefaultPasswordEncoder(); authManagerBuilder.inMemoryAuthentication() .withUser(users.username("FOO2").password("BAR").roles("USER").build()); } }
方案2:新增独立认证提供者(无需修改组件扫描规则)
利用Spring Security认证链自动聚合所有AuthenticationProvider的特性,新增独立的用户认证逻辑,和原有配置完全无冲突:
@Configuration public class AdditionalUserConfig { // 定义新增用户的内存管理器 @Bean public UserDetailsService additionalUserDetailsService() { User.UserBuilder users = User.withDefaultPasswordEncoder(); InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager(); manager.createUser(users.username("FOO2").password("BAR").roles("USER").build()); return manager; } // 注册新增用户对应的认证提供者 @Bean public AuthenticationProvider additionalAuthenticationProvider() { DaoAuthenticationProvider provider = new DaoAuthenticationProvider(); provider.setUserDetailsService(additionalUserDetailsService()); // 和原有配置保持相同的密码编码器 provider.setPasswordEncoder(PasswordEncoderFactories.createDelegatingPasswordEncoder()); return provider; } }
该方案原理为:Spring Security的ProviderManager会遍历所有注册的认证提供者,只要任意一个认证通过就算请求认证成功,原有用户和新增用户分别走独立的认证逻辑,不会出现实例覆盖问题。
内容的提问来源于stack exchange,提问作者frostbyte
相关产品推荐
相关产品推荐

