需求:用户数据可能来自不同的标,在认证的时候,如果第一张表没有查找到用户,就去第二张表中查询
数据源可能并不是都是数据库,可能有些用户信息来自内存,有些数据信息来自 Redis,有些用户信息来自数据库
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
MyUserDetailsService myUserDetailsService;
@Autowired
MyUserDetailsService2 myUserDetailsService2;
@Override
@Bean
public AuthenticationManager authenticationManagerBean() throws Exception {
DaoAuthenticationProvider dao1 = new DaoAuthenticationProvider();
dao1.setUserDetailsService(myUserDetailsService);
DaoAuthenticationProvider dao2 = new DaoAuthenticationProvider();
dao2.setUserDetailsService(myUserDetailsService2);
ProviderManager manager = new ProviderManager(dao1, dao2);
return manager;
}
@Service
@Primary
public class MyUserDetailsService implements UserDetailsService {
@Autowired
UserMapper userMapper;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = userMapper.loadUserByUsername(username);
if (user == null) {
throw new UsernameNotFoundException("用户不存在");
}
user.setRoles(userMapper.getRolesByUid(user.getId()));
return user;
}
}