Ich habe das selbst nicht ausprobiert, aber es scheint, Spring Security eine Lösung dieses Problems hat mit der SavedRequestAwareAuthenticationSuccessHandler
in der Aktualisierung von Bobs Blog .
Beim Arbeiten mit Spring Security + CAS treffe ich immer wieder eine kleine Straßensperre mit der Rückruf-URL, die an CAS gesendet wird, also die Service-Eigenschaft. Ich habe mir eine Reihe von Beispielen angesehen, wie diese und dies , aber alle verwenden hartcodierte URLs (auch Spring CAS-Dokumentation ). Ein typischer Snip sieht ungefähr so aus ...
%Vor% Erstens möchte ich den Servernamen oder den Port nicht hart codieren, da ich möchte, dass dieser WAR irgendwo deploybar ist und ich nicht möchte, dass meine Anwendung während der Kompilierung an einen bestimmten DNS-Eintrag gebunden ist. Zweitens verstehe ich nicht, warum Spring den Kontext meiner Anwendung und die URL der Anfrage automatisch erkennen kann. Der erste Teil dieser Aussage steht immer noch, aber As Raghuram wies darauf hin mit < a href="https://jira.springsource.org/browse/SEC-1374"> dieser Link , können wir den HTTP-Host-Header aus Sicherheitsgründen nicht vom Client aus vertrauen.
Idealerweise möchte ich, dass die Service-URL genau das ist, was der Benutzer angefordert hat (solange die Anfrage gültig ist, wie eine Subdomain von mycompany.com), so dass es nahtlos ist oder ich zumindest nur einige angeben möchte Pfad relativ zu meinem Anwendungskontext root und lässt Spring die Service-URL im laufenden Betrieb ermitteln. Etwas wie das Folgende ...
%Vor%ODER ...
%Vor%Ist das alles möglich oder einfach oder habe ich das Offensichtliche verpasst?
Im Frühjahr 2.6.5 Frühling könnten Sie org.springframework.security.ui.cas.ServiceProperties
erweiternIm Frühjahr 3 ist die Methode endgültig. Sie können dies umgehen, indem Sie CasAuthenticationProvider und CasEntryPoint ableiten und dann mit Ihrer eigenen Version von ServiceProperties verwenden und die getService () -Methode mit einer dynamischeren Implementierung überschreiben.
Sie können den Host-Header verwenden, um die erforderliche Domäne zu berechnen und sie sicherer zu machen, indem Sie überprüfen, dass nur Domänen / Subdomains unter Ihrer Kontrolle verwendet werden. Fügen Sie dann einen konfigurierbaren Wert hinzu.
Natürlich hätten Sie das Risiko, dass Ihre Implementierung unsicher ist ... also seien Sie vorsichtig.
Es könnte am Ende aussehen wie:
%Vor%Ich weiß, dass das ein bisschen alt ist, aber ich musste gerade dieses Problem lösen und konnte wirklich nichts in den neueren Stapeln finden.
Wir haben mehrere Umgebungen, die denselben CAS-Service nutzen (think dev, qa, uat und lokale Entwicklungsumgebungen); Wir haben die Möglichkeit, jede Umgebung von mehr als einer URL aus zu erreichen (über den Client-seitigen Webserver über einen Reverse-Proxy und direkt zum Back-End-Server selbst). Dies bedeutet, dass die Angabe einer einzelnen URL bestenfalls schwierig ist. Vielleicht gibt es eine Möglichkeit, dies zu tun, aber eine dynamische ServiceProperties.getService()
verwenden zu können. Ich werde wahrscheinlich eine Art Server-Suffix-Prüfung hinzufügen, um sicherzustellen, dass die URL irgendwann nicht entführt wird.
Hier ist, was ich getan habe, um den grundlegenden CAS-Ablauf unabhängig von der URL zu erhalten, die für den Zugriff auf die gesicherte Ressource verwendet wurde ...
CasAuthenticationFilter
. CasAuthenticationProvider
. setAuthenticateAllArtifacts(true)
für ServiceProperties
. Hier ist die lange Form meiner Frühlingskonfiguration Bean:
%Vor%Nur die übliche Frühlingskonfiguration Bean.
%Vor%Einige externalisierte Konfigurationsparameter.
%Vor% Das Wichtigste oben ist der setAuthenticateAllArtifacts(true)
Aufruf. Dies führt dazu, dass der Serviceticket-Validierer die AuthenticationDetailsSource
-Implementierung anstelle eines fest codierten ServiceProperties.getService()
-Aufrufs verwendet
%Vor%
Standardticketvalidator ..
%Vor%Standard-Hook für einen vorhandenen UserDetailsService
%Vor%Standardauthentifizierungsanbieter
%Vor% Hier ist die dynamicServiceResolver()
Einstellung ..
Erstellt dynamisch die Service-URL von der Methode makeDynamicUrlFromRequest()
. Dieses Bit wird bei der Ticketvalidierung verwendet.
Dieser Teil verwendet denselben dynamischen URL-Ersteller, wenn CAS zum Anmeldebildschirm umleiten möchte.
%Vor%Das ist, was immer du daraus machst. Ich habe nur die ServiceProperties übergeben, um den URI des Dienstes zu speichern, für den wir konfiguriert sind. Wir verwenden HATEAOS auf der Rückseite und haben eine Implementierung wie:
%Vor%Bearbeiten: Hier ist, was ich für die Liste der gültigen Server-Suffixe getan habe.
%Vor%Ich habe versucht, CasAuthenticationProvider abzuleiten, wie es Pablojim vorschlägt, aber die Lösung ist sehr viel einfacher! Mit Spring Expression Language (SPEL) können Sie die URL dynamisch abrufen.
Beispiel: <property name="service"
value="https://#{T(java.net.InetAddress).getLocalHost().getHostName()}:${application.port}${cas.service}/login/cascheck"/>
Ich habe das selbst nicht ausprobiert, aber es scheint, Spring Security eine Lösung dieses Problems hat mit der SavedRequestAwareAuthenticationSuccessHandler
in der Aktualisierung von Bobs Blog .
Tags und Links java spring spring-security cas