Printemps de Démarrage avec Tomcat intégré derrière proxy Apache
Nous avons un Printemps de Démarrage (Spring MVC) app avec Tomcat intégré dédié, serveur d'applications derrière Apache proxy SSL.
Le port SSL sur le serveur proxy est 4433, transfert vers le port 8080 sur le serveur d'applications.
Donc l'URL du serveur proxy, redirection comme:
https://proxyserver:4433/appname >>forward>> http://appserver:8080/
Lors de l'exécution SANS proxy, la première chose qui se passe est que
Printemps de Sécurité redirige la demande, comme:
http://appserver:8080/ >>redirect>> http://appserver:8080/login
pour afficher le formulaire de connexion, par l'extension de WebSecurityConfigurerAdapter
avec
...
httpSecurity.formLogin().loginPage("/login") ...
...
Il fonctionne très bien sans le proxy, mais AVEC un mandataire de la redirection doit être changé,
donc, le Printemps devrait plutôt rediriger correspondant à l'URL de proxy, comme:
http://appserver:8080/ >>redirect>> https://proxyserver:4433/appname/login
mais sans succès encore.
Je suis en train d'appliquer cette solution:
59.8 Tomcat, derrière un serveur proxy frontal
Nous avons configuré mod_proxy dans Apache, et vérifié qu'il envoie attendus en-têtes:
X-Forwarded-For: xxx.xxx.xxx.xxx
X-Forwarded-Host: proxyserver
X-Forwarded-Port: 4433
X-Forwarded-Proto: https
Du démarrage de l'application avec des paramètres:
export ARG1='-Dserver.tomcat.protocol-header=x-forwarded-proto'
export ARG2='-Dserver.tomcat.remote-ip-header=x-forwarded-for'
java $ARG1 $ARG2 -jar webapp.jar
Encore la redirection ne fonctionne pas.
Il gardera rediriger localement, à http://appserver:8080/login
qui n'est pas à la disposition des clients.
Est-il autre chose que nous devons faire pour rendre ce scénario de travail?
Mise à JOUR
Aussi, je suis préoccupé par le "/appname" la partie de l'URL de proxy. Sur le serveur d'applications, l'application est la racine "/". Comment doit-Printemps-être indiqué que "/appname" doit être inclus dans toutes les Url renvoyé aux clients, quand à passer par le proxy?
- Légèrement inquiétant, la JVM propriétés: serveur.tomcat.protocole de l'en-tête, serveur.tomcat.remote-ip-d'en-tête ..... docs.printemps.io/spring-boot/docs/actuel-SNAPSHOT/de référence/... elles sont écrites avec des caractères de soulignement après le dernier point, tandis que dans le docs.printemps.io/spring-boot/docs/current/reference/html/... elles sont écrites par des tirets. Ce qui est correct? J'ai essayé les deux variantes, mais n'a pas de résoudre le problème ci-dessus.
- il convient de souligner
server.tomcat.remote_ip_header=x-forwarded-for
server.tomcat.protocol_header=x-forwarded-proto
- Printemps de démarrage utilise détendue de liaison pour les propriétés, de sorte qu'il n'a probablement pas d'importance si elles sont des traits de soulignement ou des tirets ou même des points
Vous devez vous connecter pour publier un commentaire.
J'ai eu le même problème l'autre jour. Après un peu de débogage de Printemps de Démarrage 1.3 j'ai trouvé la solution suivante.
1. Vous devez paramétrer les en-têtes sur votre proxy Apache:
2. Vous devez indiquer à votre Ressort de Démarrage de l'application à utiliser ces en-têtes. Donc, mettez la ligne suivante dans votre application.propriétés (ou tout autre lieu où le Printemps Bottes comprend propriétés):
Si vous faites ces deux choses correctement, tous les rediriger votre application envoie sera pas aller à http://127.0.0.1:8080/%5Bchemin d'accès] mais automatiquement à https://www.myapp.com/%5Bchemin d'accès]
Mise à jour 1. La documentation sur ce sujet est ici. Vous devriez le lire au moins être conscient de la propriété
server.tomcat.internal-proxies
qui définit la plage d'adresses IP pour les serveurs proxy qui peut être digne de confiance.server.use-forward-headers=true
travaille pour Google Cloud d'Équilibrage de la ChargeProxyPreserveHost On
est foutu important... 🙂 Si Vous omettre, Votre demande sera redirigé vers localhost au lieu de garder l'original de l'hôte avec l'adresse canonique.Votre procuration a l'air bien, et de ce fait l'application backend, jusqu'à un certain point, mais il ne semble pas être de voir la
RemoteIpValve
demande modifiée. Le comportement par défaut de laRemoteIpValve
comprend un modèle de correspondance de l'adresse IP du proxy (comme un contrôle de sécurité) et il modifie uniquement les demandes qu'il pense à partir d'un proxy valide. Le modèle par défaut dans le Printemps de Démarrage à un ensemble d'adresses IP internes comme10.*.*.*
et192.168.*.*
, donc si votre proxy n'est pas sur l'un de ces, vous devez configurer explicitement, par exemple(en utilisant les propriétés de format de fichier, ce qui signifie que vous avez à double échapper à l'anti-slash).
Vous pouvez voir ce qui se passe dans le
RemoteIpValve
si vous définissezou définir un point d'arrêt en elle.
Une solution classique à ce problème est de laisser le proxy traiter les réécrire. Par exemple, dans Apache, vous pouvez utiliser le rewrite_module et/ou headers_module pour corriger les en-têtes. Comme autre exemple, Nginx gère cela et d'autres cas similaires pour vous automatiquement après la configuration des serveurs en amont.
En réponse aux commentaires:
Quels sont les remote_ip_header et protocol_header printemps de configuration de démarrage des valeurs?
Oublions Printemps de Démarrage pour un moment. Tomcat, l'embedded conteneur de servlet, dispose d'une valve connu comme le RemoteIpValve. Cette valve est un port de Apache remotip_module. Le but principal de cette vanne est de traiter les "useragent qui a initié la demande que l'origine de l'useragent" "aux fins d'autorisation et d'enregistrement". Pour cette vanne pour être utilisée, elle doit être configurée.
Veuillez trouver plus d'informations sur cette vanne ici.
Printemps de Démarrage idéalement prend en charge la configuration de cette vanne via l'application.propriétés à travers le serveur.tomcat.remote_ip_header et le serveur.tomcat.protocol_header propriétés.
J'ai eu exactement le même cas à l'aide de haproxy comme équilibreur de charge avec le dessous de la configuration, ce qui worled pour moi. La seule chose, c'est l'IP du client est en
request.getRemoteAddr()
et pas dans"X-Forwarded-For"
en-têteDans l'application.propriétés:
Avez-vous essayé de réglage
Au Printemps De Démarrage?
Essayez de définir la règle de Réécriture comme:
https://proxyserver:4433/appname >>avant>> http://appserver:8080/appname
Et ensuite configurer votre application en contexte pour "appname"
serveur.contexte-path=/appname
Localement, vous pouvez exécuter par http://appserver:8080/appname et via Proxy Inverse vous auriez accès via https://proxyserver:4433/appname
Depuis que je suis à l'aide de JBOSS, des changements dans la version autonome.xm de jboss:
Tomcat donnait la même config, pour l'informer de Tomcat (proxy-adresse-forwarding="true") à l'égard de proxy, l'adresse de transfert.