Ich habe eine Spring MVC-Anwendung mit Spring Security gesichert. Der Großteil der Anwendung verwendet einfaches http, um Ressourcen zu sparen, aber ein kleiner Teil verarbeitet mehr vertrauliche Informationen und benötigt einen https-Kanal.Requires HTTPS mit Spring Security hinter einem Reverse-Proxy
Auszug aus den security-config.xml
:
<sec:http authentication-manager-ref="authenticationManager" ... >
...
<sec:intercept-url pattern="/sec/**" requires-channel="https"/>
<sec:intercept-url pattern="/**" requires-channel="http"/>
</sec:http>
Alle funktionierte gut, bis wir es an den Hauptserver zu migrieren, entschieden, wo die Anwendungsserver hinter laufen Reverse Proxies. Und da nun HTTPS von den Reverse-Proxys verarbeitet wird, sieht der Anwendungsserver nur HTTP-Anfragen und verbietet den Zugriff auf die /sec/**
-Hierarchie.
Nach einigen Recherchen fand ich, dass die Proxys hinzufügen X-Forwarded-Proto: https
Header (*), aber in Spring Security HttpServletRequest.isSecure()
verwendet wird, um den Kanal Sicherheit angeboten (Auszug aus SecureChannelProcessor
javadoc)
Wie kann, um zu bestimmen Ich sage Spring Security, dass ein X-Forwarded-Proto: https
Header für eine sichere Anfrage ausreicht?
Ich weiß, ich könnte diesen Teil auf Proxies-Konfiguration melden, aber der Proxies-Administrator mag diese Lösung wirklich nicht, da hinter den Proxies viele Anwendungen stecken und die Konfiguration in einen nicht überschaubaren Zustand wachsen könnte.
Ich benutze derzeit Spring Security 3.2 mit XML-Konfiguration, aber ich bin bereit, Antworten basierend auf Java-Konfiguration und/oder neuere Version zu akzeptieren.
(*) natürlich entfernen die Proxies die Kopfzeile, wenn sie in der eingehenden Anfrage vorhanden war, damit die Anwendung darin sicher sein kann.
Was ist Ihr App-Server? Gibt es dafür keine Einstellung im Tomcat Connector? –
@NeilMcGuigan: Ja, es ist ein Tomcat. Könnte es so einfach sein? –
@NeilMcGuigan: Bitte schreibe es als Antwort, damit ich es annehmen kann. –