多数据源是指在同一个系统中,用户数据来自不同的表,在认证时,如果第一张表没有查到用户,那就去第二章表中查找,以此类推。
认证要经过AuthenticationProvider,每一个 AuthenticationProvider 中都配置了一个 UserDetailsService,而不同的UserDetailsService 则可以代表不同的数据源。所以我们只需要手动配置多个AuthenticationProvider ,并为不同的AuthenticationProvider 提供不同的UserDetailsService 即可。代码如下:
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
MyUserDetailsService userDetailsService;
@Bean
@Primary
UserDetailsService u1(){
return new InMemoryUserDetailsManager(User.builder()
.username("jean").password("{noop}123").roles("admin").build());
}
@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
DaoAuthenticationProvider dao1 = new DaoAuthenticationProvider();
dao1.setUserDetailsService(u1());
DaoAuthenticationProvider dao2 = new DaoAuthenticationProvider();
dao2.setUserDetailsService(userDetailsService);
ProviderManager manager = new ProviderManager(dao1,dao2);
return manager;
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest().authenticated()
//......
}
}
首先定义两个UserDetailsService 实例,不同实例中存储了不同用户;然后重写 authenticationManagerBean 方法,在方法中,定义了两个DaoAuthenticationProvider 实例并分别设置了不同的UserDetailsService;最后构建ProviderManager 实例并传入两个DaoAuthenticationProvider 。当系统进行身份认证的时候,就会遍历ProviderManager 中不同的 DaoAuthenticationProvider ,进而调用到不同的数据源。