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
Allgemeine Strategie
- Geben Sie eine benutzerdefinierte Implementierung von
org.springframework.security.authentication.AuthenticationProvider
, dass die Delegierten die Authentifizierung an den entsprechenden Back-End (Dritt-Service, ein andererAuthenticationProvider
, etc.). - Übergeben Sie die benutzerdefinierte Option an die benutzerdefinierte
AuthenticationProvider
, damit sie das richtige Authentifizierungs-Back-End auswählen kann. - 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.
- 1. Spring Security 3.2 Token Authentifizierung
- 2. Spring Security + Ldap Authentifizierung
- 3. Spring-Security: Anrufmethode nach Authentifizierung
- 4. Spring Security-Authentifizierung mit UserDetailsService
- 5. Spring Security Authentifizierung über Token
- 6. Spring Security - Benutzerdefinierte LDAP-Authentifizierung
- 7. Benutzerdefinierte Authentifizierung überschreibt Spring Security
- 8. Spring Security: Authentifizierung Benutzer manuell
- 9. Spring Security und JSON-Authentifizierung
- 10. LDAP-Authentifizierung - Spring Security - LdapAuthenticationProvider
- 11. Authentifizierung mit Spring Security + Spring Daten + MongoDB
- 12. Spring Security benutzerdefinierten Authentifizierungsfilter mit Java Config
- 13. Spring Security und benutzerdefinierte ws-Authentifizierung
- 14. Grails 3 Spring Security Pre Authentifizierung
- 15. AngularJS-Authentifizierung mit Spring Security CORS-Probleme
- 16. Spring Security: Authentifizierung gibt null zurück
- 17. Spring Security und benutzerdefinierte externe Authentifizierung
- 18. Wie implementiert man benutzerdefinierte Authentifizierung in Spring Security 3?
- 19. So implementieren Anmeldung Throttling mit Spring Security?
- 20. Zugriff auf HttpServletRequest während DaoAuthenticationProvider Authentifizierung in Spring Security
- 21. PartialResultException bei der Authentifizierung mit Spring Security und JavaConfig
- 22. Wann sollte ich Spring Security ACL in meiner Anwendung implementieren?
- 23. Wie implementieren Baumknoten mithilfe der Spring Security ACL?
- 24. OpenId Authentifizierung und automatische Registrierung mit Spring Security 3.0.2
- 25. So implementieren Sie Openid Connect und Spring Security
- 26. Spring Security OAuth2 - @ EnableOauth2Sso aber Token zur Authentifizierung akzeptiert auch
- 27. WebSphere Portal Spring Security
- 28. Spring Security: Set GratedAuthorities
- 29. Spring Security Rest Plugin: Authentifizierung fehlgeschlagen, keine AuthenticationProvider
- 30. Verwendung von benutzerdefinierten Ausdrücken in Spring Security @ PreAuthorize/@ PostAuthorize-Annotationen
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 :) –
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