2015-06-19 8 views
13

Ich richte meine Spring Security (v4.0.1) Web-Anwendung. Ich möchte zwei Authentifizierungsanbieter haben, einen "in-memory", der das Administratorkonto verwaltet, und einen benutzerdefinierten, der auf meine eigene Implementierung verweist. Das System sollte zunächst die Authentifizierung gegen den "In-Memory" -Anbieter und an zweiter Stelle gegen den Custom-Provider versuchen. Mein Code sieht so aus:Im Speicher und benutzerdefinierte Anbieter alle zusammen

@Autowired 
public void configureGlobal(AuthenticationManagerBuilder auth, 
    AuthenticationProvider provider) throws Exception { 
    auth.inMemoryAuthentication() 
      .withUser("admin") 
      .password("s3cr3t") 
      .authorities("ADMIN"); 
    auth.authenticationProvider(provider); 
} 

Dieser Code führt jedoch das Framework, um zuerst meine benutzerdefinierte Implementierung zu testen. Es ist ein wenig sinnvoll, da die Methode AuthenticationManagerBuilder#authenticationProvider einen Provider der internen Liste hinzufügt, während der AuthenticationManagerBuilder#inMemoryAuthentication intern konfiguriert wird. Wie kann ich es schaffen, dass es funktioniert?

Antwort

20

Sie können Ihre InMemoryUserDetailsManagerConfigurer manuell und melden Sie es schaffen, sich auf dem AuthenticationManagerBuilder zu konfigurieren, wenn Sie konfiguriert haben es so installiert sie es AuthenticationProvider vor Ihrer Gewohnheit ein:

@Autowired 
public void configureGlobal(AuthenticationManagerBuilder auth, 
     AuthenticationProvider provider) throws Exception { 

    inMemoryConfigurer() 
     .withUser("admin") 
      .password("s3cr3t") 
      .authorities("ADMIN") 
     .and() 
     .configure(auth); 
    auth.authenticationProvider(provider); 
} 

private InMemoryUserDetailsManagerConfigurer<AuthenticationManagerBuilder> 
     inMemoryConfigurer() { 
    return new InMemoryUserDetailsManagerConfigurer<>(); 
} 

Normalerweise was passiert ist, dass die InMemoryUserDetailsManagerConfigurer erstellt und zur Liste der Konfiguratoren hinzugefügt, die angewendet werden sollten, wenn die erstellt wird - nachdem Sie Ihre benutzerdefinierte AuthenticationProvider installiert haben.

+0

Es funktioniert definitiv ;-) –

3

Mehr oder weniger von spring.io Documentation

Wenn Sie XML-Konfiguration verwenden (zB feder security.xml):

<security:authentication-manager> 
    <security:authentication-provider ref="FirstProvider" /> 
    <security:authentication-provider ref="SecondProvider" /> 
</security:authentication-manager> 

(Ich bin mit, dass das Setup für einen der Spring integrierten Authentifizierungsanbieter neben einem benutzerdefinierten, funktioniert gut)

Wenn Sie Java Config verwenden, kann ich nur eine andere Person post maclema on Java config for multiple authentication provider verweisen, da ich nie (erfolgreich) Code Config

versucht haben
+0

Danke für die Antwort, ich verwende nicht die XML-Konfiguration. Was ich erreichen möchte, ist etwas, das Ihrer verknüpften Antwort ähnlich ist, aber anstatt zwei benutzerdefinierte Authentifizierungsanbieter zu haben, habe ich einen benutzerdefinierten und einen anderen im Speicher, der von Spring zur Verfügung gestellt wird. Da der speicherinterne über den AuthenticationManagerBuilder definiert ist, weiß ich nicht, wie er hinzugefügt wird. –

Verwandte Themen