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!)
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
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: [/*]
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]
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! !!
Hier sehen wir uns den Vorgang an, wenn eine Anforderung zum Anzeigen einer sicheren Seite ("Indexbildschirm") ohne Anmeldung erfolgt.

| 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). |
Hier sehen wir uns den Vorgang an, wenn eine Anforderung zum Anzeigen des vom Anbieter bereitgestellten Autorisierungsbildschirms über den von "DefaultLoginPageGeneratingFilter" generierten Anmeldebildschirm erfolgt.

| 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. |
Sehen wir uns hier den Vorgang an, wenn eine Autorisierungsanforderung auf dem Autorisierungsbildschirm von GitHub gestellt wird.

| 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. |
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.
Recommended Posts