Sécurité du printemps redirection vers la page précédente après une connexion réussie

je sais que cette question a déjà été posée, mais je fais face à un problème particulier ici.

j'utilise la sécurité du ressort 3.1.3.

j'ai 3 connexion possible cas dans mon application web:

  1. connexion via la page de Connexion: OK.
  2. connexion via une page restreinte: OK too.
  3. connexion via une page non-restreinte: pas OK... un "produit" peut être consulté par tout le monde, et un utilisateur peut poster un commentaire si il est connecté. Donc un formulaire de connexion est inclus dans la même page, afin de permettre aux utilisateurs de se connecter.
<!-Le problème avec le cas 3) est que je ne peux pas rediriger les utilisateurs vers la page "produit". Ils redirigé vers la page d'accueil après une connexion réussie, n'importe quoi.

notez qu'avec le cas 2) la redirection vers la page restreinte fonctionne hors de la boîte après la connexion réussie.

Voici la partie pertinente de ma sécurité.fichier xml:

<!-- Authentication policy for the restricted page  -->
<http use-expressions="true" auto-config="true" pattern="/restrictedPage/**">
    <form-login login-page="/login/restrictedLogin" authentication-failure-handler-ref="authenticationFailureHandler" />
    <intercept-url pattern="/**" access="isAuthenticated()" />
</http>

<!-- Authentication policy for every page -->
<http use-expressions="true" auto-config="true">
    <form-login login-page="/login" authentication-failure-handler-ref="authenticationFailureHandler" />
    <logout logout-url="/logout" logout-success-url="/" />
</http>

je soupçonne le "la stratégie d'authentification pour chaque page" pour être responsable du problème. Cependant, si je le supprime, je ne peux pas me connecter plus... j_spring_security_check envoie une erreur 404.


EDIT:

grâce à Ralph, j'ai pu trouver une solution. Alors voilà le truc: j'ai utilisé la propriété

<property name="useReferer" value="true"/>

que Ralph m'a montré. Après que j'ai eu un problème avec mon cas 1) : lors de la connexion via la page de connexion, l'utilisateur est resté dans la même page (et pas redirigé vers la page d'accueil, comme il l'habitude d'être). Le code jusqu'à cette étape était le suivant:

<!-- Authentication policy for login page -->
<http use-expressions="true" auto-config="true" pattern="/login/**">
    <form-login login-page="/login" authentication-success-handler-ref="authenticationSuccessHandlerWithoutReferer" />
</http>

<!-- Authentication policy for every page -->
<http use-expressions="true" auto-config="true">
    <form-login login-page="/login" authentication-failure-handler-ref="authenticationFailureHandler" />
    <logout logout-url="/logout" logout-success-url="/" authentication-success-handler-ref="authenticationSuccessHandler"/>
</http>

<beans:bean id="authenticationSuccessHandler" class="org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler">
    <!-- After login, return to the last visited page -->
    <beans:property name="useReferer" value="true" />
</beans:bean>

<beans:bean id="authenticationSuccessHandlerWithoutReferer" class="org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler">
    <!-- After login, stay to the same page -->
    <beans:property name="useReferer" value="false" />
</beans:bean>

cela devrait fonctionner, en théorie du moins, mais ce n'était pas le cas. Je ne sais toujours pas pourquoi, donc si quelqu'un a une réponse à ce sujet, je vais volontiers créer un nouveau sujet pour lui permettre de partager sa solution.

en attendant, j'ai trouvé une solution. Pas la meilleure solution, mais comme je l'ai dit, si quelqu'un a quelque chose de mieux à montrer, je suis tout ouïe. Donc, c'est la nouvelle politique d'authentification pour la connexion page:

<http use-expressions="true" auto-config="true" pattern="/login/**" >
    <intercept-url pattern="/**" access="isAnonymous()" />
    <access-denied-handler error-page="/"/>
</http>

La solution est assez évident: la page de connexion n'est autorisée que pour les utilisateurs anonymes. Une fois qu'un utilisateur est connecté, le gestionnaire d'erreur redirige vers la page d'accueil.

j'ai fait quelques tests, et tout semble fonctionner à merveille.

45
demandé sur Cœur 2013-01-29 04:19:48

7 réponses

ce qui se passe après la connexion (à quelle url l'utilisateur est redirigé) est géré par AuthenticationSuccessHandler.

cette interface (une classe concrète l'implémentant est SavedRequestAwareAuthenticationSuccessHandler) est invoquée par l' AbstractAuthenticationProcessingFilter ou un de ses sous-classes comme (UsernamePasswordAuthenticationFilter) dans la méthode successfulAuthentication.

donc pour avoir une autre redirection dans le cas 3 vous devez sous-classe SavedRequestAwareAuthenticationSuccessHandler le faire à faire ce que vous voulez.


parfois (en fonction de votre usecase exacte) il suffit pour permettre à l' useReferer drapeau de AbstractAuthenticationTargetUrlRequestHandler qui est invoquée par SimpleUrlAuthenticationSuccessHandler (super classe de