Frühlingssicherheit
Spring Security ist ein Sicherheitsrahmen, das umfassende Sicherheitslösungen für J2EE -Projekte bieten kann. Es stützt sich auf Servlet -Filter. Diese Filter schnitten eingehende Anfragen ab und führen eine gewisse Sicherheitsverarbeitung durch, bevor die Anmeldung die Anfrage verarbeitet.
Spring Security fällt die Benutzeranfragen wie folgt ab:
Hintergrund
In einem Projekt, das von vorne und hinterher getrennt ist, wird Springsicherheit als Sicherheitsrahmen verwendet, und JWT wird verwendet, um das Berechtigungsmanagement zu implementieren, um die Sicherheit der erholsamen API zu verbessern. Das erste, was mir begegnet war, war das Cross-Domain-Problem, aber während des Tragens der JWT-Anfrage konnte der Server die JWT nicht erhalten.
Cross-Domänen-Probleme
Während des Entwicklungsprozesses stieß ich auf das Problem der CORS (Cross-Domain-Ressourcenfreigabe). Ich habe einfach den Cross-Domänen-Zugriff auf der Serverseite eingerichtet, er trat jedoch während des Tragens von JWT-Anforderungen auf.
Da JWT in den Anforderungsheader platziert ist, ignoriert es, dass die Cross-Domänen-Verarbeitung das Header-Feld hinzufügt, auf dem sich selbst eingestellt werden kann.
@ComponentPublic Class CorsFilter implementiert Filter {Logger logger = loggerFactory.getLogger (corsfilter.class); @Override public void init (filterconfig filterconfig) löst servletException {} @Override public void dofilter (servletRequest servletRequest, servletResponse servletresponse, filterchain filterchain) aus ioException, servletException {httpletrequest; HttpServletResponse response = (httpServletResponse) servletResponse; response.setheader ("Access-Control-Allow-Origin", Request.Getheader ("Origin")); response.setheader ("Access-Control-Allow-Origin", "*"); //Response.Setheader("Access-control-Allow-methods","post,get, options, Delete,put "); // Die Anforderungsmethode, die verwendet werden darf, Antwort zu verwenden. Response.Setheader ("Access-Control-Allow-Header", "X-Requested-with, Cache-Control, Pragma, Content-Typ, Autorisierung"); // Die Anforderungsmethode, die verwendet werden darf. Antwort. // Die Anforderungsmethode, die verwendet werden darf. Antwort. // ob Anfragen mit Überprüfungsinformationen filterchain.dofilter (ServletRequest, ServletResponse) zuzulassen; } @Override public void destroy () {}} Suchen Sie online erwähnt, dass es notwendig war, Optionenanfragen zu verarbeiten und 200 zurückzugeben, aber der Test funktioniert nicht
Die Optionsanfrage hier ist tatsächlich eine Vorfilsanforderung
Preflight -Anfrage
Das Problem wurde jedoch nicht wie folgt gelöst
Erst nach Google ist über die Informationen über die Vorfilsanforderung bekannt
Wenn wir die Hintergrundschnittstelle anrufen, stellen wir oft fest, dass wir zweimal angefordert haben. Tatsächlich ist das erste Mal, dass wir Senden von Preflight Anfrage (Preflight -Anfrage).
Warum Sie eine Preflight -Anfrage benötigen
Wir alle wissen, dass die gleichorientierte Richtlinie der Browser darin besteht, dass Browser aus Sicherheitsgründen die von Skripten initiierten Cross-Domain-HTTP-Anforderungen einschränken. XMLHTTPREQUEST UND ABSCHAFT ALLE DER ARGINISCHE RICHTIGE.
Im Allgemeinen gibt es Browser zwei Möglichkeiten, Cross-Domänen-Anfragen einzuschränken:
Der Browser beschränkt die Ausgabe von Cross-Domain-Anfragen und Cross-Domänen-Anfragen. Die Cross-Domänen-Anfragen können normal initiiert werden, aber das zurückgegebene Ergebnis wird vom Browser abgefangen.
Im Allgemeinen beschränken Browser die Cross-Domänen-Anfragen in der zweiten Art und Weise, dh die Anfrage ist auf dem Server eingetreten und kann die Daten in der Datenbank betreiben. Das zurückgegebene Ergebnis wird jedoch vom Browser abgefangen, sodass wir das Rückgabeergebnis nicht erzielen können. Dies ist eine fehlgeschlagene Anfrage, die sich jedoch auf die Daten in der Datenbank auswirken kann.
Um dies zu verhindern, erfordert die Spezifikation, dass für diese HTTP-Anforderungsmethode, die möglicherweise Nebenwirkungen auf die Serverdaten hat, der Browser zunächst die Optionsmethode verwenden muss, um eine Vorfilsanforderung zu initiieren, um zu wissen, ob der Server die Cross-Domain-Anforderung zulässt: Wenn dies zulässig ist, senden Sie eine reale Anforderung mit Daten. Wenn nicht erlaubt, verhindern Sie, dass eine echte Anfrage mit Daten gesendet wird.
Der Browser unterteilt CORS-Anforderungen in zwei Kategorien: einfache Anfragen und nicht einfache Anfragen.
Einfache Anfrage
1. Die Anforderungsmethode ist eine der folgenden drei Methoden
2. Die Headerinformationen von HTTP überschreiten die folgenden Felder nicht
Jeder, der die beiden oben genannten Bedingungen nicht gleichzeitig erfüllt, ist eine nicht einfache Anfrage.
Der Browser behandelt diese beiden Anfragen anders.
Keine einfache Anfrage
Eine nicht-einfache Anforderung ist eine Anfrage, die spezielle Anforderungen für den Server enthält, z. B. wird die Anforderungsmethode eingestellt oder gelöscht, oder der Typ des Feldtyps ist Anwendung/JSON.
Eine CORS -Anfrage, die keine einfache Anfrage darstellt, fügt eine HTTP -Abfrageanforderung vor der offiziellen Kommunikation hinzu, die als "Preflight" -Anforderung (Preflight) bezeichnet wird.
Weitere Informationen zu CORs finden Sie im Link unten unten
Lösung
In unserem Hintergrund wird die Frühlingssicherheit als Sicherheitsrahmen verwendet, und es wird keine entsprechende Verarbeitung an die Anforderung vor dem Flug vorgenommen, sodass diese Anfrage die Berechtigungssteuerung fehlschlägt.
Es ist auch sehr einfach zu verarbeiten. Sie müssen der Konfigurationsmethode der Spring Security Configuration Class nur eine Release Preflight -Anforderung hinzufügen.
@Override Protected void configure (httpecurity http) löst Ausnahme aus {http // Da wir JWT verwenden, brauchen wir keine csrf .csrf (). Disable () // Basierend auf Token, wir brauchen keine Sitzung. Alle Anfragen für/werden veröffentlicht. .AntMatchers ("/api/**"). Genehmigungen () .AntMatchers ("/v2/api-docs", "/configuration/ui", "/Swagger-Resources/**", "/configuration/**",","/swagger-ui.html",/webjars/** ". "/configuration/ui", "/Swagger-Resources/**", "/configuration/**","/swagger-ui.html", "/webjars/**") .Permitall () .AntMatchers ("/verwalten/**"). Authentifizierung.AnlyRequest (). authenticated (); // Cache http.Headers () deaktivieren. CacheControl (); // JWT Filter http.addFilterbefore (AuthenticationTokenFilterbean (), usernamePasswordAuthenticationFilter.class) hinzufügen; // Unauthorisierte Verarbeitung http.exceptionHandling (). AuthenticationEntryPoint (getAuthenticationEntryPoint ()) hinzufügen; // unzureichende Berechtigungen verarbeiten http.exceptionHandling (). AccessDeniedHandler (getAccessDeniedHandler ()); }Das Problem wurde endlich gelöst!
Zusammenfassen
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Referenzwert für das Studium oder die Arbeit eines jeden hat. Wenn Sie Fragen haben, können Sie eine Nachricht zur Kommunikation überlassen. Vielen Dank für Ihre Unterstützung bei Wulin.com.
Siehe:
Front-End | Eine kurze Diskussion über die Anfrage vor dem Flug
Cross-Domänen-Ressourcen-Sharing CORs Detaillierte Erklärung