2010-02-17 4 views
5

In der Regel, wenn Sie für Ihre Anwendung "< Authentication-Provider >" deklarieren (in meinem Fall Webapp), kümmert sich Spring Security um den Aufruf von Providern nacheinander, falls ein Fehler auftritt. Also, ich habe DatabaseAuthenticationProvider und LDAPAuthenticationProvider mit DatabaseAuthenticationProvider zuerst in der Konfigurationsdatei deklariert, zur Laufzeit wird DatabaseAuthenticationProvider zuerst aufgerufen und wenn die Authentifizierung fehlschlägt, versucht LDAPAuthentication. Das ist cool - aber was ich brauche, ist ein Laufzeitschalter.Die Authentifizierungsmethoden zur Laufzeit mit Spring Security wechseln?

Ich hätte gerne eine Option zwischen diesen beiden Ansätzen zu wählen (datenbankbasierte Authentifizierung/ldap-basierte Authentifizierung) und irgendwie die Implementierung basierend auf dieser globalen Einstellung.

Wie mache ich das? Ist es mit Spring-Security überhaupt möglich?

Antwort

4

Ich werde verlassen, wie Sie eigene Authentifizierungs-Provider auf die andere Vielzahl von Beispielen aus Googleland und hier auf StackOverflow injizieren. Es sieht so aus, als ob es eine bestimmte Bean mit der XML-Datei markiert. Aber hoffentlich kann ich einige andere Details für dich ausfüllen.

So haben Sie die Klasse etwas definiert wie oben, und ich werde mehr von den Details hinzufügen, die Sie für den Frühling benötigen (dh das Material von oben als auch fusionieren.

public class SwitchingAuthenticationProvider implements AuthenticationProvider 
{ 
    .... 
    public List<AuthenticationProvider> getProviders() { return delegateList; } 
    public void setProviders(List<AuthenticationProvider> providers) { 
     this.delegateList = providers; 
    } 
    .... 
} 

Dies ermöglicht Ihnen eine Vielzahl von Anbietern mit Feder zu injizieren:

<bean id="customAuthProvider1" class=".....CustomProvider1"> ... </bean> 
<bean id="customAuthProvider2" class=".....CustomProvider2"> ... </bean> 
... 
<bean id="customAuthProviderX" class=".....CustomProviderX"> ... </bean> 

<bean id="authenticationProvider" class="....SwitchingAuthenticationProvider"> 
    <security:custom-authentication-provider/> 
    <!-- using property injection (get/setProviders) in the bean class --> 
    <property name="providers"> 
     <list> 
      <ref local="customAuthProvider1"/> <!-- Ref of 1st authenticator --> 
      <ref local="customAuthProvider2"/> <!-- Ref of 2nd authenticator --> 
      ... 
      <ref local="customAuthProviderX"/> <!-- and so on for more --> 
     </list> 
    </property> 
</bean> 

Am Ende, wie Sie die Anbieter bevölkern jedes Mittel sein könnten, den delegator eine Sammlung von Anbietern bekommen Wie sie ist, die man zur Karte bis zu verwenden, bis zu. Sie könnten die Auflistung basierend auf dem aktuellen Status des Delegierer. Es könnte eine Liste von mehr als einem sein, um es zu versuchen. Es könnte zwei Eigenschaften geben, "get/setPrimary" und "get/setSecondary" für eine fail-over-ähnliche Funktionalität. Sobald Sie den Delegierten injiziert haben, stehen Ihnen die Möglichkeiten offen.

Lassen Sie mich wissen, ob dies Ihre Frage nicht beantwortet.

+0

@Matt Danke. Das hilft. Ich werde das ausprobieren und Sie wissen lassen. – Jay

3

Wie schreibt man einen delegierenden AuthenticationProvider, der weiß, wie er auf den Runtime-Switch und die tatsächlichen Instanzen von Database/LDAP AuthenticationProvider zugreift?

Ich denke an so etwas wie:

public class SwitchingAuthenticationProvider implements AuthenticationProvider 
{ 
    private List<AuthenticationProvider> delegateList; 
    private int selectedProvider; 

    @Override 
    public Authentication authenticate(Authentication authentication) 
     throws AuthenticationException 
    { 
     AuthenticationProvider delegateTo = delegateList.get(selectedProvider); 
     return delegateTo.authenticate(authentication); 
    } 

    .... 
} 
+0

@ Matt Das ist gut. Aber wie beziehe ich diese Liste der Authentifizierungsanbieter? – Jay

+0

@Matt Ich weiß, es ist eine dumme Frage, aber ich bin nur ein weiterer Frühling Neuling. – Jay

+0

Jay, werde ich später mehr schreiben, mit etwas genauer, aber man konnte sie in Ihre SwitchingAuthenticationProvider als nur ein weiteres Feder Bohne injizieren. – Matt