2010-10-17 2 views
5

J'utilise Spring Security 3.0 avec JSP. J'ai créé un RequireVerificationFilter qui redirige les utilisateurs non vérifiés vers une page "vérifier votre adresse e-mail".Spring Security 3.0: Comment spécifier les URL auxquelles un filtre personnalisé s'applique?

J'ai ajouté le filtre à la pile de filtres de sécurité du printemps à la dernière place comme ceci:

définition Bean dans mon app-config.xml:

<bean id="requireVerificationFilter" class="com.ebisent.web.RequireVerificationFilter" /> 

Filtre ajouté à la liste des filtres de sécurité printemps dans mon security-config.xml:

<custom-filter ref="requireVerificationFilter" after="LAST" /> 

Le filtre fonctionne, mais il filtre sa propre URL de redirection. En d'autres termes, le filtre redirige les utilisateurs non vérifiés vers/access/verify, mais cette URL est également interceptée par le filtre, qui tente de rediriger l'annonce à l'infini.

J'ai essayé d'utiliser la balise <filter-mapping> pour restreindre les URL auxquelles ce nouveau filtre s'applique, mais cela ne semble pas fonctionner comme je le souhaitais. Voici l'entrée web.xml j'ai ajouté de toute façon:

<filter> 
     <filter-name>requireVerificationFilter</filter-name> 
     <filter-class>com.ebisent.web.RequireVerificationFilter</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>requireVerificationFilter</filter-name> 
     <url-pattern>/account/*</url-pattern> 
    </filter-mapping> 

J'ai lu « Ajout dans vos propres filtres » dans la sécurité du printemps documention, mais n'a pas trouvé une réponse.

Ma question est: Comment puis-je spécifier les URL auxquelles mon filtre s'applique?

MISE À JOUR:

Je suis arrivé ce travail en spécifiant l'URL pour permettre dans le filtre lui-même. Cela fonctionne bien pour moi, mais s'il y a une meilleure façon de le faire, je serais heureux de l'entendre.

Répondre

2

Vous devez faire ceci dans le xml de configuration réelle (même endroit que vous avez le <custom-filter ref="requireVerificationFilter" after="LAST" />.

<http ...> 
    <intercept-url pattern="/access" ... filters="..., requireVerificationFilter, ..." /> 
    <intercept-url pattern="/verify" ... filters="none" /> 
    ... 
</http> 

Quelque chose le long de ces lignes, vous pouvez spécifier une liste des filtres que vous voulez exécuter et exclure que vous les ne pas (et "none" signifie none) Vous ne devriez pas avoir besoin d'ajouter votre filtre au web.xml - seulement en ligne avec la chaîne de filtre Spring Security

+0

Merci beaucoup! J'ai des tags d'intercept-url dans ma configuration de sécurité, mais je ne savais pas que vous pouviez spécifier des filtres. – outis

+5

Mais [Spring Security Reference Documentation] (http://static.springsource.org/spring-security/site/docs/3.1.x/reference/springsecurity-single.html#nsa-intercept-url-parents) indique que: Attribut 'filters'" Peut uniquement prendre la valeur "none" ". – btpka3

3

Vous devriez utiliser org.springframework.security.web.FilterChainProxy pour cela. contient uniquement none:

<http ...> 
     <custom-filter ref="requireVerificationFilterChain" after="LAST" /> 
</http> 

<b:bean id="requireVerificationFilterChain" class="org.springframework.security.web.FilterChainProxy"> 
     <filter-chain-map request-matcher="ant"> 
      <filter-chain pattern="/account/*" filters="requireVerificationFilter"/> 
     </filter-chain-map> 
</b:bean> 
<b:bean id="requireVerificationFilter" class="com.ebisent.web.RequireVerificationFilter" /> 
+0

Cette solution a fonctionné pour moi, merci! –

Questions connexes