2010-10-07 6 views
2

J'ai une application grails avec le plugin spring-security-core installé. Tout fonctionne bien localement. J'ai été déployé sur un serveur de transfert et tout a bien fonctionné. Je me suis déployé sur notre serveur de production qui est un miroir de notre serveur de transfert. Je peux très bien aller aux pages non protégées. Mais lorsque Spring Security entre en jeu et essaie de faire ses redirections, il redirige vers localhost au lieu de grails.serverURL.Spring Security redirige vers localhost sur le serveur de production

Je vais lancer la journalisation aussi haut que possible et redéployer pour voir si je peux faire la tête ou la queue de quoi que ce soit. Je posterai ma trouvaille ici. Si quelqu'un a déjà vécu cela et sait ce qui pourrait se passer, s'il vous plaît faites le moi savoir. De plus, s'il y a des fichiers de configuration à voir, je peux aussi les fournir. Merci.

Mise à jour j'ajouté ce qui suit au fond Config.groovy

grails.plugins.springsecurity.useSecurityEventListener = true 

grails.plugins.springsecurity.onAuthorizationEvent = { e, appCtx -> 
    println "here" 
    println e 
} 

localement, que la fermeture se fait frapper 2 fois lorsque je tente et accéder à une page protégée. Une fois pour l'URL initiale. Deuxième fois pour l'url auth. Déployé cela sur notre serveur de production et je n'ai rien.

+0

Y a-t-il quelque chose dans votre SecurityConfig.groovy qui pourrait pointer vers localhost? – hvgotcodes

+0

SecurityConfig.groovy n'existe pas dans spring-security-core. Il utilise Config.groovy. Donc, non, il n'y en a pas. – Gregg

Répondre

5

Les redirections sont effectuées en org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint.commence()method, vous pouvez donc définir un point d'arrêt si vous êtes en mesure d'emprunter l'un des serveurs prod pour le débogage.

Il crée l'URL de redirection basée sur le formulaire de connexion uri (par exemple,/login/auth), mais il utilise request.getServerName() et doit donc être identique à la demande d'origine. Notez que grails.serverURL n'a aucun impact ici car il construit l'URL en utilisant le nom de serveur demandé, le port, le contexte, etc.

Il peut être affecté en plaçant Apache ou un équilibreur de charge devant votre conteneur de servlet, même si j'ai fait à la fois et ça a bien fonctionné.

Avez-vous effectué une personnalisation du bean dans resources.groovy qui pourrait affecter cela?

+0

Merci Burt. Non, notre resource.groovy est vide. Nous avons Apache assis devant avec mod_proxy. Le plus grand point de confusion pour moi est pourquoi il fonctionnerait sur un serveur, mais pas sur l'autre, lorsque les deux sont exactement la même configuration à l'exception du domaine qui lui est mappé via DNS. – Gregg

+0

J'ai marqué cette réponse comme correcte pour mon problème dans cette request.getServerName() renvoie en effet localhost, ce qui est incorrect. J'ai juste besoin de savoir pourquoi cela se passe. – Gregg

5

Si votre serveur d'applications se trouve derrière un serveur Web, ce problème est probablement dû à la configuration de votre serveur Web. J'ai eu le même problème et l'ai corrigé en utilisant l'entrée suivante dans mon httpd.conf ou apache2.conf. Ici c'est ... Notez que les tags xml sont incomplets car je ne voulais pas passer le temps à apprendre à leur échapper. (: P)


*...boilerplate configuraton here...* 

################################ 
# Begin yourdomain.com...  # 
################################ 

ProxyRequests Off 
ProxyPreserveHost On 

Proxy *> 
    Order deny,allow 
    Allow from all 
/Proxy> 

ProxyPass/http://localhost:28080/ 
ProxyPassReverse/http://localhost:28080/ 

Location/> 
    Order allow,deny 
    Allow from all 
/Location> 

################################ 
# ... end yourdomain.com  # 
################################ 
+0

O mon dieu, cela a résolu mon enquête de près de trois jours pour rediriger vers localhost, merci beaucoup! :) – webmaster

2

En supposant que vous avez un serveur web (apache, nginx, etc.) en tant que proxy devant Tomcat (et que vous utilisez Tomcat) ...

Dans une configuration où vous autorisez HTTP et HTTPS, ajoutez un élément de connecteur séparé au fichier conf/server.xml de tomcat:

<Connector port="8081" protocol="HTTP/1.1" 
      connectionTimeout="20000" 
      redirectPort="8443" URIEncoding="UTF-8" 
      scheme="https" secure="true" proxyName="somehostname.domain" proxyPort="443" /> 

Si seulement https est autorisé, vous pouvez ajouter le système, sécurisé, proxyName et proxyPort attribue à l'actuel élément de connecteur.

Dans Apache Config, définissez le proxy d'hôte virtuel *: 443 sur le Connecteur avec les attributs supplémentaires. Le simple http *: 80 peut se connecter au connecteur d'origine.

Pour plus d'informations: http://tomcat.apache.org/tomcat-7.0-doc/config/http.html#Proxy_Support http://tomcat.apache.org/tomcat-7.0-doc/proxy-howto.html

1

Je sais que c'est une vieille question, mais je voudrais ajouter mes conclusions pour aider les autres utilisateurs qui pourraient rencontrer ce problème.

En plus de la réponse de Burt (je suppose que vous utilisez tomcat), je trouve que la valeur retournée de request.getServerName() peut également être réglé via server.xml

-à-dire dans tomcat 8 https://tomcat.apache.org/tomcat-8.0-doc/config/http.html

ayant cette ligne dans server.xml

<Connector protocol="HTTP/1.1" 
      port="8080" ... 
proxyName="localhost"/> 

retournerait "localhost" quand getServerName est invoquée.

Questions connexes