[JAVA] Erfahren Sie mehr über die Architektur der Spring Security-Authentifizierungsverarbeitung

Spring Security scheint aus irgendeinem Grund zu funktionieren, aber ich bin süchtig danach, es anzupassen. Deshalb habe ich es untersucht und zusammengefasst, aus der Idee heraus, dass Sie es irgendwie verstehen können, wenn Sie die Architektur kennen.

Untersuchen Sie anhand des folgenden Formularauthentifizierungsszenarios, welche Art von Klasse welche Rolle spielt.

  1. Greifen Sie auf eine Seite zu, für die eine Authentifizierung erforderlich ist, ohne authentifiziert zu werden
  2. Zum Anmeldebildschirm umgeleitet
  3. Geben Sie die Informationen ein und führen Sie den Anmeldevorgang aus
  4. Die Anmeldung ist abgeschlossen und Sie werden zu dem Bildschirm weitergeleitet, auf den Sie in 1 zugegriffen haben.

Die Version wird in 5.2.1.RELEASE bestätigt.

Bis Sie zum Anmeldebildschirm weitergeleitet werden

So springen Sie zum Anmeldebildschirm, wenn ein nicht authentifizierter Benutzer auf eine Seite zugreift, für die eine Authentifizierung erforderlich ist. Die grobe Strömung ist wie folgt. Dieses Mal werde ich den Überprüfungsprozess beim Zugriff nicht erläutern, sondern an der Stelle beginnen, an der "AuthenticationException" ausgelöst wird.

ログイン遷移.png

ExceptionTranslationFilter

Ursache der aufgetretenen Ausnahme Überprüfen Sie die Ausnahme. Wenn "AuthenticationException" enthalten ist, speichern Sie den Inhalt der Anforderung in "RequestCache" und starten Sie den Authentifizierungsprozess mit "AuthenticationEntryPoint". RequestCache verwendet normalerweise HttpSession, um den Anforderungsinhalt zu speichern. HttpSessionRequestCache wird verwendet. Wir werden sehen, wofür "RequestCache" später verwendet wird.

AuthenticationEntryPoint

Starten Sie den Authentifizierungsprozess. Beispielsweise leitet "LoginUrlAuthenticationEntryPoint" zur URL der konfigurierten Anmeldeseite weiter. BasicAuthenticationEntryPoint gibt eine Antwort mit dem Statuscode 401 und dem Header mit WWW-Authenticate zurück, um die Basic-Authentifizierung zu initiieren.

Zusammenfassung des Übergangs des Anmeldebildschirms

Es wird von ExceptionTranslationFilter behandelt, muss aber nicht bewusst sein, da es nicht sehr individuell angepasst ist. Es ist erforderlich, "AuthenticationEntryPoint" richtig auszuwählen und festzulegen, um die Authentifizierung zu starten. Wenn Sie beispielsweise zum Anmeldebildschirm wechseln möchten, müssen Sie die URL des Anmeldebildschirms mit "LoginUrlAuthenticationEntryPoint" festlegen. Wenn Sie den Authentifizierungsprozess nicht unter der Annahme starten müssen, dass Sie wie SSO im Voraus authentifiziert werden. Verwenden Sie beispielsweise "Http403ForbiddenEntryPoint".

Es scheint, dass Sie die Implementierungsklasse, die für die Anforderung verwendet werden soll, auch mithilfe von "DelegatingAuthenticationEntryPoint" definieren können.

Authentifizierungsprozess

Zunächst der Ablauf, bis die vom Benutzer eingegebenen Informationen empfangen werden und die Authentifizierung in Ordnung ist. Es ist ungefähr wie folgt.

認証.png

AuthenticationManager

Es ist "AuthenticationManager", der die Authentifizierung steuert. Empfängt ein "Authentifizierungs" -Objekt und gibt ein "Authentifizierungs" -Objekt zurück, wenn die Authentifizierung in Ordnung ist. Das Argument "Authentifizierung" enthält nur die für die Authentifizierung erforderlichen Prinzipien und Anmeldeinformationen, und der Rückgabewert "Authentifizierung" enthält auch Informationen wie Berechtigungen und Details.

ProviderManager

Es gibt "ProviderManager" als Implementierungsklasse von "AuthenticationManager". Diese Klasse wird standardmäßig verwendet. Diese Klasse delegiert den Authentifizierungsprozess an mehrere "AuthenticationProvider". Wenn auch nur einer davon in Ordnung ist, ist die Authentifizierung erfolgreich. Auf diese Weise ist es möglich, mehrere Authentifizierungsprozesse wie die Formularauthentifizierung unter Verwendung von in einer Datenbank gespeicherten Informationen und die Authentifizierung durch LDAP zu kombinieren. Sie können auch Anmeldeinformationen aus der Rückgabe "Authentifizierung" entfernen, um zu verhindern, dass vertrauliche Informationen beibehalten werden.

AuthenticationProvider

Authentifizieren. Wenn eine Kennwortüberprüfung erforderlich ist, verwenden Sie diese Klasse.

Es gibt auch eine Methode, um festzustellen, ob es sich um eine authentifizierbare Implementierungsklasse "Authentifizierung" handelt. Im Fall einer normalen Formularauthentifizierung kann der Authentifizierungsprozess beispielsweise ausgeführt werden, wenn ein Benutzername und ein Kennwort vorhanden sind, jedoch nicht alle Authentifizierungsprozesse ausreichen. Daher wird die Methode "unterstützt (Klasse <?> Authentifizierung)" verwendet, um zu bestimmen, ob der Authentifizierungsprozess ausgeführt werden kann oder nicht.

Implementierungsklassen werden für allgemeine Authentifizierungsmethoden bereitgestellt, sodass Sie sie grundsätzlich verwenden können. Da der Teil, der Benutzerinformationen abruft, von der Definition der von der Anwendung verwendeten Datenbank abhängt, gibt es viele Muster, in denen nur dieser Teil implementiert ist.

UserDetailsService

Eine Schnittstelle zur Verarbeitung des oben genannten Teils in Bezug auf die Erfassung von Benutzerinformationen. Es wird häufig verwendet, indem eine Implementierungsklasse für diese Schnittstelle erstellt und auf "AuthenticationProvider" gesetzt wird.

Die zu erfassenden Informationen müssen eine Klasse sein, die "UserDetails" implementiert.

Eine Implementierungsklasse namens "JdbcDaoImpl" wird ebenfalls bereitgestellt, aber da die Informationen, die abgerufen werden können, begrenzt sind, denke ich, dass ich sie selbst implementieren werde.

Authentifizierungsprozess aufrufen

Grundsätzlich wird es von Filter aufgerufen. Um beispielsweise die Formularauthentifizierung durchzuführen, wird "UsernamePasswordAuthenticationFilter" aufgerufen. Dieser Filter erstellt aus den Eingabeinformationen des Benutzers ein "UsernamePasswordAuthenticationToken" -Objekt, bei dem es sich um eine Implementierungsklasse von "Authenticaion" handelt, und ruft den Authentifizierungsprozess von "AuthenticationManager" auf. Wenn die Authentifizierung erfolgreich ist, besteht die Aufgabe darin, die erhaltenen Authentifizierungsinformationen in "SecurityContextHolder" festzulegen. (Siehe unten für "SecurityContextHolder")

Authentifizierungsprozess Zusammenfassung bisher

Es ist unwahrscheinlich, dass Sie "AuthenticationManager" implementieren. Es scheint, dass Sie die Standardimplementierungsklasse "ProviderManager" verwenden sollten. Ich denke, dass "AuthenticationProvider" die gewünschte Implementierungsklasse bereitstellt, wählen Sie sie also entsprechend aus. Wenn Sie jedoch eine neue Authentifizierungsmethode wie WebAuthn erstellen möchten, die Spring Security noch nicht unterstützt, müssen Sie sie implementieren. Gleiches gilt für Filter.

Sie erstellen häufig eine eigene Implementierungsklasse für "UserDetailsService", um Benutzerinformationen abzurufen.

Persistenz der Anmeldeinformationen

Indem die nach Abschluss der Authentifizierung erhaltenen Authentifizierungsinformationen dauerhaft gemacht werden, kann festgestellt werden, ob die Authentifizierung abgeschlossen wurde oder nicht, und es ist möglich, auf die Benutzerinformationen zuzugreifen.

永続化.png

SecurityContext

Ein Objekt mit Anmeldeinformationen ("Authentifizierung"). Behalten Sie diesen "SecurityContext" bei, anstatt die Anmeldeinformationen unverändert beizubehalten.

SecurityContextRepository

Eine Schnittstelle, um "SecurityContext" dauerhaft zu machen. Sie können sich "HttpSession" als einen Ort vorstellen, an dem Anmeldeinformationen beibehalten werden, aber Spring Security bietet auch "HttpSessionSecurityContextRepository", eine Implementierungsklasse, die "HttpSession" verwendet. (Standardmäßig verwenden)

SecurityContextHolder

Die Klasse, die den "SecurityContext" enthält. Standardmäßig wird es mit ThreadLocal beibehalten. Wenn Sie auf die Anmeldeinformationen zugreifen möchten, können Sie sie von diesem "SecurityContextHolder" abrufen, anstatt direkt auf die "HttpSession" zuzugreifen.

SecurityContextPersistenceFilter

Holen Sie sich "SecurityContext" aus "SecurityContextRepository" und setzen Sie es auf "SecurityContextHolder", bevor ein Prozess gestartet wird. Nachdem die gesamte Verarbeitung abgeschlossen ist, holen Sie sich "SecurityContext" aus "SecurityContextHolder", machen Sie es mit "SecurityContextRepository" dauerhaft und löschen Sie "SecurityContext" aus "SecurityContextHolder". SecurityContextHolder verwendet ThreadLocal, aber dieser Filter übernimmt den Löschvorgang.

Persistenzzusammenfassung

Anmeldeinformationen werden als "SecurityContext" beibehalten, und "SecurityContextRepository" übernimmt die Verarbeitung in Bezug auf die Persistenz, aber Sie müssen sich dessen nicht sehr bewusst sein. Es ist gut daran zu denken, dass Sie den "SecurityContext" vom "SecurityContextHolder" erhalten können.

Verhalten nach erfolgreicher oder erfolgloser Authentifizierung

Einige Filter, die den Authentifizierungsprozess aufrufen, können das Verhalten definieren, wenn die Authentifizierung erfolgreich ist oder fehlschlägt. Beispielsweise kann es in "UsernamePasswordAuthenticationFilter" definiert werden, das die Formularauthentifizierung durchführt, nicht jedoch in "BasicAuthenticationFilter", das die Basisauthentifizierung durchführt.

AuthenticationSuccessHandler

認証成功.png

Definieren Sie den Prozess, wenn die Authentifizierung erfolgreich ist. Einige Implementierungsklassen werden bereitgestellt, aber "SavedRequestAwareAuthenticationSuccessHandler" wird standardmäßig verwendet. Diese Klasse leitet eine Anforderung um, wenn sie in "RequestCache" enthalten ist. Wenn es nicht beibehalten wird, leiten Sie zur konfigurierten Standard-URL um.

Greifen Sie im nicht authentifizierten Zustand auf die Seite zu, für die eine Authentifizierung erforderlich ist, und leiten Sie sie zum Authentifizierungsbildschirm um. Danach können Sie nach Abschluss der Authentifizierung zu dem Bildschirm wechseln, den Sie zuerst anzeigen wollten, weil Sie diese Klasse verwenden.

AuthenticationFailureHandler

認証失敗.png

Definieren Sie die Verarbeitung, wenn die Authentifizierung fehlschlägt. Es werden auch einige Implementierungsklassen bereitgestellt, aber "SimpleUrlAuthenticationFailuerHandler" wird standardmäßig verwendet. Diese Klasse ist ziemlich einfach und leitet zur angegebenen URL weiter. Durch Speichern der Ausnahme, die aufgetreten ist, als die Authentifizierung in "HttpSession" fehlgeschlagen ist, kann auf das Umleitungsziel verwiesen werden.

Zusammenfassung der Vorgänge nach erfolgreicher und nicht erfolgreicher Authentifizierung

Verwenden Sie "AuthenticationSuccessHandler" bzw. "AuthenticationFailuerHandler", um das Verhalten nach erfolgreicher und nicht erfolgreicher Authentifizierung zu definieren. Die bereitgestellte Implementierungsklasse leitet nur (oder abhängig von den Einstellungen weiter) an die angegebene URL weiter. Wenn Sie also erweiterte Aufgaben ausführen möchten, müssen Sie eine Implementierungsklasse erstellen. Beachten Sie außerdem, dass die Einstellung je nach Authentifizierungsmethode möglicherweise nicht möglich ist.

Ausloggen

Melden Sie sich auch ab. ログアウト.png

LogoutFilter

Rufen Sie nach dem Aufruf von "LogoutHandler", der die Abmeldeverarbeitung ausführt, "LogoutSuccessHandler" auf, der die Nachbearbeitung durchführt. Sie können eine URL zum Abmelden definieren. (Standard ist / logout)

LogoutHandler

Verarbeitung abmelden. SecurityContextLogoutHandler verwirft HttpSession. Oder ist es eine Voraussetzung, dass die Authentifizierungsinformationen in "HttpSession" gespeichert werden? Ich glaube nicht, dass es in "HttpSession" gespeichert ist, abhängig von der Implementierung von "SecurityContextRepository". Es gibt jedoch keine Methode zum Löschen. Hmm ...

Beachten Sie, dass "LogoutFilter" eine Klasse namens "CompositeLogoutHandler" verwendet, die mehrere "LogoutHanlder" kombiniert, sodass mehrere "LogoutHandler" nach Bedarf nacheinander ausgeführt werden können.

LogoutSuccessHandler

Führt die Verarbeitung nach Abschluss der Abmeldung durch. SimpleUrlLogoutSuccessHandler leitet zur angegebenen URL weiter.

Zusammenfassung der Abmeldung

Wenn Sie den Abmeldevorgang anpassen möchten, können Sie "LogoutHandler" implementieren und auf "LogoutFilter" setzen. Wenn Sie den Bildschirmübergang nach Abschluss der Abmeldung anpassen möchten, implementieren Sie "LogoutSuccessHandler" und setzen Sie ihn auf "LogoutFilter".

Referenz-URL

schließlich

Ich habe das Gefühl, Spring Security zu verstehen! (Wegen meines Verstandes)

Recommended Posts

Erfahren Sie mehr über die Architektur der Spring Security-Authentifizierungsverarbeitung
Informationen zur Spring Security-Authentifizierung
Spring Security-Nutzungsnotiz Authentifizierung / Autorisierung
Implementierte Authentifizierungsfunktion mit Spring Security ②
Implementierte Authentifizierungsfunktion mit Spring Security ③
Spring Boot Tutorial Verwenden der Spring Security-Authentifizierung
Implementierte Authentifizierungsfunktion mit Spring Security ①
Zertifizierung / Autorisierung mit Spring Security & Thymeleaf
Setzen Sie das Spring Security-Authentifizierungsergebnis auf JSON
DB-Authentifizierung mit Spring Security und Hashing mit BCrypt
Erreichen Sie die BASIC-Authentifizierung mit Spring Boot + Spring Security
Versuchen Sie die LDAP-Authentifizierung mit Spring Security (Spring Boot) + OpenLDAP
Fügen Sie mit Spring Security Ihre eigenen Authentifizierungselemente hinzu
[Einführung in Spring Boot] Authentifizierungsfunktion mit Spring Security
Führen Sie nach der Standardauthentifizierung mit Spring Boot eine beliebige Verarbeitung aus.
Spring Security erhöht 403 verboten
Erstellen Sie eine API-Schlüsselauthentifizierung für die Web-API in Spring Security
Spring Security-Nutzungsnotiz CSRF
Spring Security-Nutzungsnotiz Run-As
Feder mit Kotorin --6 Asynchrone Verarbeitung
Sicherheit der Verwendungsnotizmethode für Spring Security
Spring Security-Nutzungsnotiz Remember-Me
Anmeldefunktion mit Spring Security
[Frühlingssicherheit] Frühlingssicherheit auf GAE (SE)
Versuchen Sie es mit Spring Boot Security
Spring Security-Nutzungsnotiz CORS
Spring Security-Verwendungsnotiztest
Beim Testen der Formularauthentifizierung mit Spring Security tritt ein 404-Fehler auf