[JAVA] Teil 2: Verstehen Sie (ungefähr) den Prozessablauf der OAuth 2.0-Anmeldung, die von Spring Security 5 unterstützt wird

Basierend auf der Demo-Anwendung, die zuletzt in "Versuchen Sie, die von Spring Security 5 mit Spring Boot unterstützte OAuth 2.0-Anmeldung mit Spring Boot zu verwenden" erstellt wurde. Ich würde gerne sehen, ob Spring Security 5 OAuth 2.0 Login im Flow realisiert. (Dieses Mal beschränken wir den Verarbeitungsablauf auf die Granularität des Servlet-Filters. → Bleiben Sie auf dem Laufenden, welche Klasse in jedem Servlet-Filter für die Verarbeitung verwendet wird!)

Vorausgesetzte Version

Aktivieren Sie die Spring Security-Debugprotokollierung

Wenn Sie den Mechanismus von Spring Security untersuchen und das Debug-Protokoll von Spring Secuirty aktivieren, können Sie das Verhalten der Sicherheitsfilter von Spring Security leichter verstehen.

src/main/resources/application.properties


logging.level.org.springframework.security=debug

Anwendungsstatus des Servlet-Filters

Wenn Sie die Demoanwendung starten, wird das folgende Protokoll ausgegeben, und Sie können bestätigen, dass der Servlet-Filter von Spring Security (springSecurityFilterChain) auf alle Anforderungen (/ *) angewendet wird.

2017-11-23 21:40:39.451  INFO 66053 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'characterEncodingFilter' to: [/*]
2017-11-23 21:40:39.451  INFO 66053 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
2017-11-23 21:40:39.451  INFO 66053 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'httpPutFormContentFilter' to: [/*]
2017-11-23 21:40:39.451  INFO 66053 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'requestContextFilter' to: [/*]
+2017-11-23 21:40:39.452  INFO 66053 --- [ost-startStop-1] .s.DelegatingFilterProxyRegistrationBean : Mapping filter: 'springSecurityFilterChain' to: [/*]

Anwendungsstatus von FilterChainProxy (springSecurityFilterChain)

Wenn Sie die Demoanwendung mit aktiviertem Spring Security-Debugprotokoll starten, wird das folgende Protokoll ausgegeben, und Sie können den Anwendungsstatus des Spring Security-Sicherheitsfilters (tatsächlich Servlet-Filter) für jedes Pfadmuster überprüfen. Ich werde. (Obwohl es aus Gründen der Lesbarkeit fehlerhaft ist, wird es tatsächlich in einer Zeile ausgegeben.)

2017-11-23 21:40:40.691  INFO 66053 --- [           main] o.s.s.web.DefaultSecurityFilterChain     : Creating filter chain: org.springframework.security.web.util.matcher.AnyRequestMatcher@1,
 [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@3cae7b8b,
 org.springframework.security.web.context.SecurityContextPersistenceFilter@20e6c4dc,
 org.springframework.security.web.header.HeaderWriterFilter@327c7bea,
 org.springframework.security.web.csrf.CsrfFilter@5246a3b3,
 org.springframework.security.web.authentication.logout.LogoutFilter@151db587,
 org.springframework.security.oauth2.client.web.OAuth2AuthorizationRequestRedirectFilter@26f7cdf8,
 org.springframework.security.oauth2.client.web.OAuth2LoginAuthenticationFilter@681adc8f,
 org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter@4682eba5,
 org.springframework.security.web.savedrequest.RequestCacheAwareFilter@4d2a1da3,
 org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@68c87fc3,
 org.springframework.security.web.authentication.AnonymousAuthenticationFilter@184dbacc, 
 org.springframework.security.web.session.SessionManagementFilter@6c65860d,
 org.springframework.security.web.access.ExceptionTranslationFilter@3f672204,
 org.springframework.security.web.access.intercept.FilterSecurityInterceptor@18eec010]

Sicherheitsfilter - Übersicht

Lassen Sie mich kurz die Rolle des Sicherheitsfilters (Servlet-Filter) in Bezug auf diesen Eintrag (OAuth 2.0-Anmeldung) vorstellen.

Security Filter Erläuterung
SecurityContextPersistenceFilter SecurityContext(Bereich zum Speichern von Anmeldeinformationen)Servlet-Filter, der einen Mechanismus für die gemeinsame Nutzung von Anforderungen bereitstellt. Das Standardverhalten ist das Teilen zwischen AnforderungenHttpSessionBenutzen.
OAuth2AuthorizationRequestRedirectFilter OAuth 2.0(OpenID Connect 1.0)Endpunkt für die Anbieterautorisierung(Endpunkt, um die Berechtigung zum Zugriff auf Benutzerinformationen des Ressourcenbesitzers zu erhalten)Ein Servlet-Filter, der einen Endpunkt für die Umleitung zu bereitstellt. Das Standardverhalten ist "/oauth2/authorization/{registrationId}Ist der Endpunktpfad.
OAuth2LoginAuthenticationFilter OAuth 2.0(OpenID Connect 1.0)Der Endpunkt für die Anmeldung bei der Demo-App mithilfe des Token-Endpunkts (Endpunkt zum Abrufen des Zugriffstokens) (der Endpunkt, der verwendet wird, wenn nach der Autorisierung auf der Anbieterseite zur Demo-App zurückgekehrt wird). Servlet-Filter zur Verfügung zu stellen. Das Standardverhalten ist "/login/oauth2/code/{registrationId}Ist der Endpunktpfad.
DefaultLoginPageGeneratingFilter Ein Servlet-Filter, der einen Endpunkt zum Generieren einer Standard-Anmeldeseite bereitstellt. Das Standardverhalten ist "GET /loginIst der Endpunktpfad. Wenn die Anmeldeseite angegeben ist, wird dieser Servlet-Filter nicht angewendet.
ExceptionTranslationFilter Ein Servlet-Filter zur Behandlung von Autorisierungsfehlern und zur Bereitstellung von Fehlerantworten. Das Standardverhalten besteht darin, zum Endpunkt umzuleiten, um die Anmeldeseite anzuzeigen, wenn eine Anmeldung erforderlich ist, und "403 Verboten" zu antworten, wenn Sie angemeldet sind (AccessDeniedHandlerKann an jede Fehlerantwort angepasst werden).
FilterSecurityInterceptor Ein Servlet-Filter, der die Autorisierungsverarbeitung basierend auf der angegebenen Zugriffsrichtlinie ausführt.

Note:

In diesem Eintrag werde ich den grundlegenden Mechanismus von Spring Secuirty weglassen. Wenn Sie also den grundlegenden Mechanismus von Spring Security kennenlernen möchten, lesen Sie @ opengl-8080s "[Spring Security Usage Memo Series](https: /) /qiita.com/opengl-8080/items/032ed0fa27a239bdc1cc) ”wird empfohlen! !!

Verstehen Sie den Ablauf von "Indexbildschirm-Anzeigeanforderung-> Anmeldebildschirm-Anzeige".

Hier sehen wir uns den Vorgang an, wenn eine Anforderung zum Anzeigen einer sicheren Seite ("Indexbildschirm") ohne Anmeldung erfolgt.

image.png

Prozessablauf
Der Ressourcenbesitzer stellt über den Benutzeragenten eine "Anforderung zur Anzeige des Indexbildschirms".(GET /)"Ich mache.
FilterSecurityInterceptorFührt die Berechtigungsverarbeitung für die "Indexbildschirm-Anzeigeanforderung" durch. In der Demoanwendung ist die Zugriffsrichtlinie "authentifiziert" für "Anforderung zum Anzeigen des Indexbildschirms" definiert, sodass eine Anforderung von einem Benutzeragenten, der nicht angemeldet ist, zu einem Autorisierungsfehler führt.
ExceptionTranslationFilterIst ein Autorisierungsfehler(AccessDeniedException)Und leiten Sie zum Anmeldebildschirm weiter. Zwischenspeichern Sie vor der Umleitung die Anforderungsinformationen, die einen Autorisierungsfehler verursacht haben (Standardimplementierung istHttpSessionDurch Speichern in (gespeichert in) kann der Indexbildschirm nach erfolgreicher Anmeldung angezeigt werden.
Der Benutzeragent fordert "Anforderungsbildschirm-Anzeigeanforderung" an.(GET /login)"Ich mache.
DefaultLoginPageGeneratingFilterReagiert auf den Anmeldebildschirm für die Anmeldung über den Anbieter (GitHub in der Demo-App).

Verstehen Sie den Ablauf von "Anmeldeanforderung (Autorisierungsbildschirm-Anzeigeanforderung) -> Autorisierungsbildschirm-Anzeige"

Hier sehen wir uns den Vorgang an, wenn eine Anforderung zum Anzeigen des vom Anbieter bereitgestellten Autorisierungsbildschirms über den von "DefaultLoginPageGeneratingFilter" generierten Anmeldebildschirm erfolgt.

image.png

Prozessablauf
Der Ressourcenbesitzer drückt auf den auf dem Anmeldebildschirm angezeigten Link und klickt auf die Anforderung zur Anzeige des Autorisierungsbildschirms (GET /oauth2/authorization/{registrationId})"Ich mache. Die Demo-Anwendung verwendet also GitHub als AnbieterregistrationIdIstgithubwerden.
OAuth2AuthorizationRequestRedirectFilterIst die Kundenregistrierungsinformation(ClientRegistration)Verweisen Sie auf den vom Anbieter bereitgestellten Autorisierungsendpunkt und leiten Sie ihn weiter.
GitHub zeigt den Autorisierungsbildschirm nach der Authentifizierung des Ressourcenbesitzers an.

Verstehen Sie den Ablauf von "Autorisierungsanforderung-> Indexbildschirmanzeige"

Sehen wir uns hier den Vorgang an, wenn eine Autorisierungsanforderung auf dem Autorisierungsbildschirm von GitHub gestellt wird.

image.png

Prozessablauf
Der Ressourcenbesitzer kann sich mit den Benutzerinformationen des Anbieters bei der Demoanwendung anmelden, indem er auf die im Autorisierungsbildschirm angezeigte "Autorisierungsschaltfläche" klickt.
GitHub weist dem von der Demoanwendung angegebenen Übergangsziel (URL für den Zugriff auf den Endpunkt, der die Authentifizierungsverarbeitung durchführt) einen Autorisierungscode zu und leitet ihn um.
Der Benutzeragent lautet "Authentifizierungsverarbeitungsanforderung (GET /login/oauth2/code/{registrationId})"Ich mache. Die Demo-Anwendung verwendet also GitHub als AnbieterregistrationIdIstgithubwerden.
OAuth2LoginAuthenticationFilterStellt eine Anforderung an den vom Anbieter bereitgestellten Token-Endpunkt und erhält das Zugriffstoken, das dem vom Anbieter empfangenen Autorisierungscode entspricht.
OAuth2LoginAuthenticationFilterVerwendet das vom Anbieter erhaltene Zugriffstoken, um eine Anforderung an den Benutzerinformationsendpunkt zu senden und die Benutzerinformationen des Quellenbesitzers abzurufen.
OAuth2LoginAuthenticationFilterGeneriert Anmeldeinformationen mithilfe der Erfassung von Token-Endpunkten und Benutzerinformations-EndpunktenSecurityContextHolderEinstellen. (Es wird hier authentifiziert)
OAuth2LoginAuthenticationFilterErstellt eine "Indexbildschirm-Anzeigeanforderung (Umleitung)" unter Bezugnahme auf die Anforderungsinformationen, die zum Zeitpunkt eines Autorisierungsfehlers zwischengespeichert wurden.
SecurityContextPersistenceFilterGeneriert die Anmeldeinformationen, wenn die Authentifizierung erfolgreich istSecurityContextHolderNehmen Sie ausHttpSessionSpeichern unter.
Der Benutzeragent fordert "Indexbildschirm-Anzeigeanforderung (GET /)"Ich mache.
SecurityContextPersistenceFilterIstHttpSessionHolen Sie sich Anmeldeinformationen vonSecurityContextHolderEinstellen. Durch Ausführen dieses Prozesses können Authentifizierungsinformationen für mehrere Anforderungen gemeinsam genutzt werden (= der authentifizierte Status kann beibehalten werden).
FilterSecurityInterceptorFührt die Berechtigungsverarbeitung für die "Indexbildschirm-Anzeigeanforderung" durch. Zu diesem Zeitpunkt ist die Autorisierung in Ordnung, da sie sich im authentifizierten Zustand befindet, und die nachfolgende Verarbeitung (Verarbeitung der Indexbildschirmanzeige) wird ausgeführt.
DemoControllerFührt einen Prozess aus, der der "Anforderung zur Anzeige des Indexbildschirms" entspricht, und antwortet auf den Indexbildschirm.

Zusammenfassung

Der von Spring Security 5 bereitgestellte Mechanismus der OAuth 2.0-Anmeldung wird durch Hinzufügen von zwei Sicherheitsfiltern, OAuth2AuthorizationRequestRedirectFilter und OAuth2LoginAuthenticationFilter, zu der vor Spring Security 4 bereitgestellten Sicherheitsfiltergruppe realisiert. Ich denke du verstehst.

Der "OAuth2AuthorizationRequestRedirectFilter" ist vollständig der eigene Sicherheitsfilter von OAuth 2.0 Login, aber der "OAuth2LoginAuthenticationFilter" spielt bei der Formularauthentifizierung dieselbe Rolle wie der "UsernamePasswordAuthenticationFilter". UsernamePasswordAuthenticationFilter verwendet den auf dem Anmeldebildschirm eingegebenen" Benutzernamen "und" Passwort "für die Authentifizierungsverarbeitung, während OAuth2LoginAuthenticationFilter den vom Anbieter (Autorisierungsserver) ausgegebenen" Autorisierungscode "für die Authentifizierungsverarbeitung verwendet. Der Unterschied zwischen diesen beiden Sicherheitsfiltern (Authentifizierungsfiltern) besteht darin, dass

Das nächste Mal möchte ich vorstellen, welche Klassen "OAuth2AuthorizationRequestRedirectFilter" und "OAuth2LoginAuthenticationFilter" für die Verarbeitung verwenden.

Referenzseite

Recommended Posts

Teil 2: Verstehen Sie (ungefähr) den Prozessablauf der OAuth 2.0-Anmeldung, die von Spring Security 5 unterstützt wird
Teil 3: Verstehen Sie den Prozessablauf der OAuth 2.0-Anmeldung, die von Spring Security 5 unterstützt wird, (gründlich)
Teil 4: Passen Sie das Verhalten der von Spring Security 5 unterstützten OAuth 2.0-Anmeldung an
Teil 1: Versuchen Sie, die von Spring Security 5 unterstützte OAuth 2.0-Anmeldung mit Spring Boot zu verwenden
Lassen Sie uns den Ablauf der Erteilung des Autorisierungscodes mit Spring Security OAuth-Part 1: Review of OAuth 2.0 erleben
Ich möchte den Ablauf der Spring-Verarbeitungsanforderungsparameter verstehen
Implementierung der Anmeldefunktion durch Spring Security (securityConfig)
Bis zur Verwendung von Spring Data und JPA Part 2
Bis zur Verwendung von Spring Data und JPA Part 1
Etwa der Ablauf der Entwicklung von Webanwendungen mit Rails.
Steuern Sie den Spring Batch-Verarbeitungsablauf mit JavaConfig.
Die Geschichte der Erhöhung von Spring Boot von 1.5 auf 2.1 Serie Teil2
Melden Sie sich mit HttpServletRequest # in Spring Security in der Servlet 3.x-Umgebung an