2017-02-09 1 views
0

Lets sagen, ich habe mehrere AuthenticationProviders in meiner Spring-Anwendung. z. B .:Steuern Sie die Reihenfolge und Logik, wie Feder Sicherheit die Liste der AuthenticationProvider

Standardmäßig wird die Federsicherheit diese Anbieter versuchen, bis eine Nicht-Null-Antwort verfügbar ist.

Frage: Kann ich dieses Verhalten anpassen, wo ich die Reihenfolge und Logik der Listenanbieter ändern kann?

Es scheint, dass ProviderManager irgendwie verantwortlich für diese Logik ist. Wäre es möglich, dieses Verhalten zu überschreiben?

Antwort

0

Ich glaube nicht, dass es eine bequeme Möglichkeit gibt, die Reihenfolge zu manipulieren, anstatt nur die Reihenfolge zu ändern, in der Sie Ihre Provider mit auth.authenticationProvider hinzufügen.

Der Builder verfügt über eine ArrayList, die jedes Mal an ihrem Ende aufgerufen wird, wenn Sie auth.authenticationProvider aufrufen. Die Bewertung erfolgt in der gleichen Reihenfolge, in der diese Anbieter ebenfalls zur Liste hinzugefügt werden.

Hoffe, das hilft!

0

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.

Verwandte Themen