2016-04-05 15 views
0

Ich möchte um Ihre Hilfe zu meinem Problem in Spring Security bitten. Ich habe eine Anforderung, bei der ich eine Anmeldeberechtigung basierend auf der vom Benutzer ausgewählten Option validieren muss. Option 1 würde den angemeldeten Benutzer über einen Drittanbieter-Dienst validieren. Option 2 wäre die normale Validierung mithilfe der Datenbankauthentifizierungsebene. Wie kann ich das umsetzen?Implementieren der benutzerdefinierten Authentifizierung in Spring Security

Antwort

5

Allgemeine Strategie

  1. Geben Sie eine benutzerdefinierte Implementierung von org.springframework.security.authentication.AuthenticationProvider, dass die Delegierten die Authentifizierung an den entsprechenden Back-End (Dritt-Service, ein anderer AuthenticationProvider, etc.).
  2. Übergeben Sie die benutzerdefinierte Option an die benutzerdefinierte AuthenticationProvider, damit sie das richtige Authentifizierungs-Back-End auswählen kann.
  3. Konfigurieren Sie den benutzerdefinierten AuthenticationProvider als Standardauthentifizierungsanbieter.

Schritt 1: AuthenticationProvider

AuthenticationProvider implementieren, ist eine Schnittstelle mit einem einzigen Verfahren. Daher kann eine benutzerdefinierte Implementierung wie folgt aussehen:

class DelegatingAuthenticationProvider implements AuthenticationProvider { 
    @Autowired 
    private ThirdPartyAuthenticationService service; 

    @Autowired 
    @Qualifier("anotherAuthenticationProvider") 
    private AuthenticationProvider provider; 

    @Override 
    public Authentication authenticate(final Authentication authentication) throws AuthenticationException { 
    // Get the user selection. 
    String selection = (String) authentication.getDetails(); 

    // Take action depending on the selection. 
    Authentication result; 
    if("ThirdParty".equals(selection)) { 
     // Authenticate using "service" and generate a new 
     // Authentication "result" appropriately. 
    } 
    else { 
     // Authenticate using "provider" and generate a new 
     // Authentication "result" appropriately. 
    } 

    return result; 
    } 
} 

Schritt 2: Übergeben Sie die Benutzerauswahl zum AuthenticationProvider

Die AuthenticationProvider Implementierung oben nimmt die Benutzerauswahl aus der details Eigenschaft das Objekt Authentication. Vermutlich müsste die Benutzerauswahl von der abgeholt und zu dem Authentication Objekt hinzugefügt werden, bevor die AuthenticationProvider aufgerufen wird. Dies bedeutet, dass eine andere Komponente, die Zugriff auf die Objekte Authentication und HttpServletRequest hat und aufgerufen wird, bevor die AuthenticationProvider implementiert werden muss.

Das Objekt Authentication wird durch eine Implementierung von AbstractAuthenticationProcessingFilter erstellt. Diese Klasse hat eine Methode mit dem Namen attemptAuthentication, die ein Objekt HttpServletRequest akzeptiert und ein Objekt Authentication zurückgibt. Es scheint also, dass dies ein guter Kandidat für die Umsetzung wäre, was benötigt wird. Für die Authentifizierung mit Benutzername und Kennwort ist die Implementierungsklasse UsernamePasswordAuthenticationFilter. Diese Klasse gibt eine neue Instanz von UsernamePasswordAuthenticationToken zurück, die eine Implementierung von Authentication ist. Eine Klasse, die UsernamePasswordAuthenticationFilter erweitert, sollte also ausreichen.

class ExtendedUsernamePasswordAuthenticationFilter extends UsernamePasswordAuthenticationFilter { 
    @Override 
    public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException { 
    ... 
    UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(username, password); 
    authentication.setDetails(obtainUserSelection(request)); 

    ... 

    return authentication; 
    } 
} 

obtainUserSelection ist eine private Methode, die die Benutzerauswahl aus der Anfrage erhält.

Schritt 3: Konfiguration

Konfigurieren Sie die AuthenticationProvider und Filterimplementierungen in der Konfiguration Spring Security. Die genauen Schritte hängen davon ab, ob XML- oder Java-Konfiguration verwendet wird.

+0

wow..dank manisch! das ist ein hack einer Fahrt, die Frühlingssicherheit lernt. Dies ist übrigens meine erste Implementierung. Können Sie mich auf eine Lernprogrammseite zur Implementierung des ExtendedUsernamePasswordAuthenticationFilter verweisen? bitte :) –

+0

Sie können [die offizielle Implementierung von 'UsernamePasswordAuthenticationFilter'] (https://github.com/spring-projects/spring-security/blob/master/web/src/main/java/org/springframework/security /web/authentication/UsernamePasswordAuthenticationFilter.java). – manish

Verwandte Themen