私は春から直接解決策を見つけることができませんでした。私は習慣を作る能力などを見つけることを望んでいたProviderManager。私の回避策は、1つを作成することです親認証プロバイダと1つの親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;
}
これが最適な解決策であるかどうかはわかりませんが、私の場合はうまくいきました。