Ich benutze einen Schlüsselbund, um meinen Rest-Service zu sichern. Ich verweise auf das Tutorial hier . Ich habe den Rest und das Frontend erstellt. Jetzt, wenn ich keycloak im Backend hinzufüge, erhalte ich einen CORS-Fehler, wenn mein Frontend einen API-Aufruf macht.
Application.java Datei im Frühjahr boot sieht aus wie
%Vor%Die keycloak-Eigenschaften in der Datei application.properties sehen wie
aus %Vor%Die Beispiel-REST-API, die ich anrufe
%Vor%Die Eigenschaften des Frontend keycloak.json umfassen
%Vor%Der CORS-Fehler, den ich bekomme
%Vor%Versuchen Sie, Ihre CORS-Bean wie mein Beispiel zu erstellen. Ich habe vor kurzem dasselbe gemacht (CORS zum Laufen gebracht) und es war ein Albtraum, weil der SpringBoot CORS-Support derzeit nicht so robust oder einfach ist wie der MVC CORS.
%Vor% So richte ich es so ein, dass es Anwendungen jeder Herkunft akzeptiert, aber wenn Sie einige der Parameter ändern, sollten Sie in der Lage sein, das zu reproduzieren, was Sie wollen. dh. Wenn Sie nur die von Ihnen erwähnten Methoden hinzufügen möchten, verketten Sie addAllowedMethod()
. Erlaubte Ursprünge wären gleich, und dann würde% code% zu addMapping("/api/*")
werden.
Bearbeiten:
Sehen Sie sich das an. Sebastian ist im Spring Engineering-Team, also ist das in etwa so gut, wie du es für eine offizielle Antwort bekommen wirst.
Ich habe keinen Zugriff auf Codebeispiele, aber basierend auf den von Ihnen eingeschlossenen Codekonfigurationen sieht es so aus, als ob eine fehlende Konfiguration dazu führt, dass CORS-Header von feder ausgeschlossen wird.
J. West reagiert ähnlich wie die letzten Probleme, die ich bei Spring und CORS erlebt habe. Ich möchte Sie jedoch warnen, sich mit der Implementierung eines Frühlingsbeispiels zu befassen, da es zwei gibt. Spring Security und Spring MVC-Anmerkungen . Beide Implementierungen arbeiten unabhängig voneinander und können nicht kombiniert werden.
Wenn Sie den Filter-basierten Ansatz so verwenden, wie Sie sind (selbst in der Praxis), bestand der Schlüssel darin, die Berechtigungsnachweise für "Zulassen" auf "Wahr" zu setzen, damit die Authentifizierungsheader vom Browser über Domänengrenzen hinweg gesendet werden. Ich würde auch empfehlen, die oben vorgeschlagene vollständige Codemethode zu verwenden, da Sie dadurch eine weitaus konfigurierbarere Webanwendung für die Bereitstellung über mehrere Domänen oder Umgebungen hinweg durch Property-Injection oder eine Serviceregistrierung erstellen können.
Access-Control-Allow-Origin
header soll von der Serveranwendungsbasis der Origin
request-Header gesetzt werden, der in der Anfrage an die Server-Anwendung geliefert wird. Normalerweise setzen Browser den Origin
-Header in der Anfrage, wenn sie eine Kreuzursprungsanforderung erkennen. Und sie erwarten einen Access-Control-Allow-Origin
Header als Antwort, um es zu erlauben.
Nun, für den Schlüsselbund hatte ich mit dem gleichen Problem zu kämpfen. Betrachtet man dies , scheint keycloak im Falle einer Fehlerantwort nicht Access-Control-Allow-Origin
header hinzuzufügen. Für mich hat es diesen Header in der Antwort jedoch nicht hinzugefügt, selbst im Falle einer Erfolgsantwort.
Als ich in den Code schaute und Breakpoints hinzufügte, bemerkte ich, dass das Objekt webOrigin for client nicht von der Kopfzeile Origin
aufgefüllt wurde, selbst wenn es übergeben wurde und daher CORS den Antwortstamm der Zugriffssteuerung nicht hinzufügte.
Ich konnte es durch Hinzufügen der folgenden Codezeile kurz vor dem Aufruf des CORS-Builds zum Laufen bringen:
%Vor%vorher:
%Vor%Nachdem ich den Code mit dieser Änderung erstellt und den Server gestartet habe, habe ich die drei Antwort-Header für die Zugriffssteuerung abgerufen:
%Vor% Ich verwende den Client Credentials Grant Type; Daher habe ich es nur in buildClientCredentialsGrant
bei TokenEndpoint.java # L473 .
Ich muss noch ein wenig Code-Diving durchführen, um sicher zu sein, dass es sich um einen Fehler bei Erfolgsantworten handelt, und um einen besseren Platz für das Client-Objekt im Schlüsselcode-Code zu finden (zB wo das Client-Objekt ist) konstruiert werden)
Sie können es gerne versuchen.
UPDATE:
Ich nehme das zurück. Ich habe meinen Client in keycloak mit Root-URL als Ссылка erneut registriert (was der Anwendungsport meines Frontends ist), und ich begann, die richtige Zugriffskontrollantwort zu erhalten Kopfzeilen. Hoffe das hilft dir.
Wenn Ihr Client einen Header für die Authentifizierung sendet, können Sie ihn nicht verwenden allowedOrigins ("*"). Sie müssen eine bestimmte Ursprungs-URL konfigurieren.