Ich konnte keine direkte Lösung von Spring finden. Ich hoffte, etwas wie die Möglichkeit zu finden, benutzerdefinierte ProviderManager zu erstellen. Meine Umgehungslösung besteht darin, einen Parent AuthenticationProvider mit einem übergeordneten UserDetailsService zu erstellen, in dem ich den Fluss aller UserDetailsServices steuern kann.
Sie Config-Klasse gehören die folgenden:
@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;
}
}
Die Eltern-Service wird den Zugang zu allen Kinderbetreuung haben. so würde es in etwa so aussehen:
@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;
}
Ich bin nicht sicher, ob dies die optimale Lösung, aber es funktionierte gut in meinem Fall.