2010-01-06 3 views
2

J'ai une application Spring (version Spring 2.5.6.SEC01, la version Spring Security 2.0.5) avec la configuration suivante:Boucle infinie en utilisant Spring Security - Login est protégée même si elle doit autoriser l'accès anonyme

web.xml

<welcome-file-list> 
    <welcome-file> 
    index.jsp 
    </welcome-file> 
</welcome-file-list> 

la page index.jsp est dans le répertoire WebContent et contient simplement une redirection:

<c:redirect url="/login.htm"/> 

Dans le appname-servlet.xml, il y a un résolveur de vue de pointer vers les pages jsp dans WEB-INF/jsp

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> 
    <property name="prefix" value="/WEB-INF/jsp/" /> 
    <property name="suffix" value=".jsp" /> 
</bean> 

Dans le fichier sécurité config.xml , j'ai la configuration suivante:

<http> 
    <!-- Restrict URLs based on role --> 
    <intercept-url pattern="/WEB-INF/jsp/login.jsp*" access="ROLE_ANONYMOUS" /> 
    <intercept-url pattern="/WEB-INF/jsp/header.jsp*" access="ROLE_ANONYMOUS" /> 
    <intercept-url pattern="/WEB-INF/jsp/footer.jsp*" access="ROLE_ANONYMOUS" /> 
    <intercept-url pattern="/login*" access="ROLE_ANONYMOUS" /> 
    <intercept-url pattern="/index.jsp" access="ROLE_ANONYMOUS" /> 
    <intercept-url pattern="/logoutSuccess*" access="ROLE_ANONYMOUS" /> 

    <intercept-url pattern="/css/**" filters="none" /> 
    <intercept-url pattern="/images/**" filters="none" /> 
    <intercept-url pattern="/**" access="ROLE_ANONYMOUS" /> 

    <form-login login-page="/login.jsp"/> 
</http> 

<authentication-provider> 
    <jdbc-user-service data-source-ref="dataSource" /> 
</authentication-provider> 

Cependant, je ne peux même pas accéder à la page de connexion et d'obtenir l'erreur suivante dans le journal:

WARNING: The login page is being protected by the filter chain, but you don't appear to have anonymous authentication enabled. This is almost certainly an error.

J'ai essayé de changer le ROLE_ANONYMOUS à IS_AUTHENTICATED_ANONYMOUSLY, en changeant la connexion page à index.jsp, login.htm, et en ajoutant des valeurs différentes interception url, mais je ne peux pas si la page de connexion est accessible et la sécurité s'applique aux autres pages. Que dois-je changer pour éviter cette boucle?

+0

Mettez le niveau de connexion à DEBUG et publiez-le ici. – rodrigoap

Répondre

4

Le problème était Il me manquait le

<anonymous /> 

tag dans la section http du fichier security-config.xml donc je n'ai pas pu accéder à la page de connexion de façon anonyme. Une fois que j'ai ajouté cela, j'ai pu accéder à la page de connexion et m'authentifier.

+0

fait ma journée !!! :) – Xorty

0

Vous devez définir auto-config attribut:

<http auto-config="true"> 
    <intercept-url ... /> 
    ... 
</http> 

EDIT: Pour éviter des problèmes avec plusieurs UserDetailsService vous pouvez probablement remplacer votre déclaration <authentication-provider> par quelque chose comme ceci:

<authentication-provider user-service-ref = "userService" /> 

<jdbc-user-service id = "userService" data-source-ref="dataSource" /> 
+0

Si je définis auto-config sur true, j'obtiens l'erreur suivante: "Plus d'un UserDetailsService enregistré Veuillez utiliser un ID spécifique dans votre configuration" Si je supprime le fournisseur d'authentification du fichier XML de sécurité, cette erreur disparaît , mais quand j'essaie de naviguer vers la page de connexion, je dois faire l'authentification http au lieu de l'authentification de formulaire que je veux. –

+0

Juste pour que les gens ne se demandent pas, l'attribut 'auto-config' est simplement en train d'ajouter' 'à la configuration (et quelques autres choses inutiles). –

0
<intercept-url pattern="/login*" access="ROLE_ANONYMOUS" /> 

vous pourriez avoir remplacé que par

<intercept-url pattern="/login*" filter="none" /> 

parce que la sécurité du printemps est juste, il ne fait pas de sens pour protéger la page de connexion

0

vous pouvez utiliser une autre s: section http

<sec:http pattern="/login" security="none" /> 

ou vous pouvez utiliser

<sec:intercept-url pattern="/login*" access="IS_AUTHENTICATED_ANONYMOUSLY" />