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 AnforderungenHttpSession Benutzen. |
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 /login Ist 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 (AccessDeniedHandler Kann 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. |
FilterSecurityInterceptor Fü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. |
ExceptionTranslationFilter Ist ein Autorisierungsfehler(AccessDeniedException )Und leiten Sie zum Anmeldebildschirm weiter. Zwischenspeichern Sie vor der Umleitung die Anforderungsinformationen, die einen Autorisierungsfehler verursacht haben (Standardimplementierung istHttpSession Durch Speichern in (gespeichert in) kann der Indexbildschirm nach erfolgreicher Anmeldung angezeigt werden. |
Der Benutzeragent fordert "Anforderungsbildschirm-Anzeigeanforderung" an.(GET /login )"Ich mache. |
DefaultLoginPageGeneratingFilter Reagiert 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 AnbieterregistrationId Istgithub werden. |
OAuth2AuthorizationRequestRedirectFilter Ist 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 AnbieterregistrationId Istgithub werden. |
OAuth2LoginAuthenticationFilter Stellt eine Anforderung an den vom Anbieter bereitgestellten Token-Endpunkt und erhält das Zugriffstoken, das dem vom Anbieter empfangenen Autorisierungscode entspricht. |
OAuth2LoginAuthenticationFilter Verwendet das vom Anbieter erhaltene Zugriffstoken, um eine Anforderung an den Benutzerinformationsendpunkt zu senden und die Benutzerinformationen des Quellenbesitzers abzurufen. |
OAuth2LoginAuthenticationFilter Generiert Anmeldeinformationen mithilfe der Erfassung von Token-Endpunkten und Benutzerinformations-EndpunktenSecurityContextHolder Einstellen. (Es wird hier authentifiziert) |
OAuth2LoginAuthenticationFilter Erstellt eine "Indexbildschirm-Anzeigeanforderung (Umleitung)" unter Bezugnahme auf die Anforderungsinformationen, die zum Zeitpunkt eines Autorisierungsfehlers zwischengespeichert wurden. |
SecurityContextPersistenceFilter Generiert die Anmeldeinformationen, wenn die Authentifizierung erfolgreich istSecurityContextHolder Nehmen Sie ausHttpSession Speichern unter. |
Der Benutzeragent fordert "Indexbildschirm-Anzeigeanforderung (GET / )"Ich mache. |
SecurityContextPersistenceFilter IstHttpSession Holen Sie sich Anmeldeinformationen vonSecurityContextHolder Einstellen. Durch Ausführen dieses Prozesses können Authentifizierungsinformationen für mehrere Anforderungen gemeinsam genutzt werden (= der authentifizierte Status kann beibehalten werden). |
FilterSecurityInterceptor Fü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. |
DemoController Fü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