web-dev-qa-db-fra.com

Connexion HTTPS avec les redirections de Spring Security vers HTTP

J'ai une application Web Spring, sécurisée avec Spring Security, fonctionnant sous EC2. Devant l'instance EC2 se trouve Elastic Load Balancer avec un certificat SSL (https se termine au niveau de l'équilibreur de charge, à savoir le port 443 -> le port 80). Ainsi, du point de vue de Tomcat, les demandes entrantes sont HTTP.

Mon formulaire de connexion est soumis à https, mais la redirection suivante passe à http (succès ou échec). L'authentification a réussi et je peux revenir à https et je suis connecté.

Ma configuration de connexion ressemble à ceci:

<security:form-login
    default-target-url="/home"
    login-page="/"
    login-processing-url="/processlogin"
    authentication-failure-url="/?login_error=1"/>

Que dois-je changer pour que l'URL par défaut et l'authentification-échec d'authentification soient passées à https?

  • Tomcat 6
  • Spring Security 3.0.x
34
Thody

Votre configuration de ressort doit être agnostique par rapport au protocole utilisé. Si vous utilisez quelque chose comme "require-channel", vous rencontrerez tôt ou tard des problèmes, surtout si vous souhaitez déployer la même application dans un environnement de développement sans https.

Pensez plutôt à configurer votre Tomcat correctement. Vous pouvez le faire avec RemoteIpValve . En fonction des en-têtes envoyés par loadbalancer, votre configuration server.xml doit contenir quelque chose comme ceci:

<Valve
   className="org.Apache.catalina.valves.RemoteIpValve"
   internalProxies=".*"
   protocolHeader="X-Forwarded-Proto"
   httpsServerPort="443"
   />

Spring déterminera l'adresse de redirection absolue en fonction de ServletRequest. Modifiez donc le httpsServerPort si vous utilisez autre chose que 443:

Le httpsServerPort est le port renvoyé par ServletRequest.getServerPort () lorsque le protocolHeader indique https protocole

20
marcelj

S'il s'agit d'une application Spring Boot (j'utilise actuellement la version 2.0.0), la configuration suivante dans le fichier application.properties devrait suffire:

server.Tomcat.protocol-header=x-forwarded-proto

Cela a fonctionné pour moi sur AWS avec un équilibreur de charge à l'avant. 

Pour Spring Boot <2.0.0, cela devrait également fonctionner (non testé)

3
Rolch2015

Une façon dont je travaille est d’ajouter la config suivante

<http auto-config="true" use-expressions="true" entry-point-ref="authenticationEntryPoint" >
    <form-login login-page="/login.jsf" authentication-failure-url="/login.jsf?login_error=t" always-use-default-target="true" default-target-url="xxxxx" />
    <logout logout-url="/logout" logout-success-url="/logoutSuccess.jsf" />
    ...
</http>

Doit ajouter always-use-default-target="true" et default-target-url="https://....". Ce n'est pas la solution idéale, car vous devez coder en dur l'URL dans la configuration.

2
Suresh

utilisez les lignes de code ci-dessous dans web.xml

<security-constraint>
  <web-resource-collection>
    <web-resource-name>Login and Restricted Space URLs</web-resource-name>
    <url-pattern>/j_security_check</url-pattern>
    <url-pattern>/loginpage.rose</url-pattern>
  </web-resource-collection>
  <user-data-constraint>
    <transport-guarantee>CONFIDENTIAL</transport-guarantee>
  </user-data-constraint>
</security-constraint>

il oblige à utiliser HTTPS.

0
mirzaei

Dans mon cas, je devais ENLEVER la propriété server.use-forward-headers=true.

Ceci est ma configuration:

Digital Ocean LB -> Pôle Kubernetes avec Ingress -> Application de démarrage à ressort

0
CelinHC

J'ai défini require-channel = "any" sur toutes les URL d'interception. Cela lui permet de continuer à fonctionner dans mon environnement de développement où je n’utilise pas SSL.

<intercept-url pattern="/createUser" access="permitAll" requires-channel="any"/>
<intercept-url pattern="/admin/**" access="hasRole('ROLE_ADMIN')" requires-channel="any"/>
<intercept-url pattern="/**" access="isAuthenticated()" requires-channel="any"/>

Créez ensuite un hôte virtuel Apache qui redirige tout le trafic vers la version HTTPS.

<VirtualHost *:80>
  ServerName www.mywebsite.com
  Redirect permanent / https://www.mywebsite.com/
</VirtualHost>
0
Andrew Westberg

J'ai eu le même problème avec Spring Boot derrière Google Kubernetes. L'ajout de ces deux lignes à application.properties l'a fait pour moi

server.Tomcat.remote-ip-header=x-forwarded-for
server.Tomcat.protocol-header=x-forwarded-proto

Source: https://docs.spring.io/spring-boot/docs/current/reference/html/howto-security.html#howto-enable-https

0
Vlad Saveluc

Je suis également confronté exactement au même problème et jusqu’au moment où j’obtiens la solution appropriée, je redirige mes demandes du serveur proxy vers le serveur Tomcat via AJP au lieu de HTTP .

ProxyPass /myproject ajp://localhost:8009/myproject
ProxyPassReverse /myproject ajp://localhost:8009/myproject
0
Agry