我找不到Spring的任何直接解決方案。我希望能夠找到諸如創建自定義ProviderManager的能力。我的解決方法是創建一個父認證提供程序與一個父UserDetailsService我可以控制所有UserDetailsServices的流。
您配置類將包括以下內容:
@Configuration
@EnableWebSecurity
public class SecConfig extends WebSecurityConfigurerAdapter {
@Autowired
UserDetailsService parentUserDetailsService;
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(ParentAuthenticationProvider());
}
@Bean
public DaoAuthenticationProvider ParentAuthenticationProvider() {
DaoAuthenticationProvider authenticationProvider = new DaoAuthenticationProvider();
authenticationProvider.setUserDetailsService(parentUserDetailsService);
return authenticationProvider;
}
}
父服務將有機會獲得所有的兒童服務。所以它會是這個樣子:
@Service
public class ParentUserDetailsService implements UserDetailsService {
@Autowired
UserDetailsService aUserDetailsService;
@Autowired
UserDetailsService bUserDetailsService;
@Autowired
UserDetailsService cUserDetailsService;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
UserDetails user = null;
/* your logic will be here.
You iterate through all of the services
or have some conditional flow. the sky is your limit!
*/
// For Example
if(cond1)
user = aUserDetailsService.loadUserByUsername(username);
else(cond2){
try{
user = bUserDetailsService.loadUserByUsername(username);
}catch(Exception e){
user = cUserDetailsService.loadUserByUsername(username);
}
}
return user;
}
我不知道這是否是最優化的解決方案,但它在我的情況下運作良好。