web-dev-qa-db-fra.com

L'appel à j_spring_security_logout ne fonctionne pas

J'essaie de configurer la fermeture de session de mon application avec j_spring_security_logout mais, pour une raison quelconque, cela ne fonctionne pas, je continue à avoir une erreur 404.

J'appelle la fonction comme ceci:

<a href="<c:url value="/j_spring_security_logout"/>"><img border="0" id="logout" src="./img/logout.png" /></a>

J'ai dans WebContent/jsp/la page principale de mon application, et les pages de connexion et de déconnexion sont dans WebContent/login /.

J'ai également vérifié cet autre article Problème avec la déconnexion de la sécurité Spring mais la solution proposée ne fonctionne pas pour moi.

Ici vous pouvez voir mon web.xml

<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>
     org.springframework.web.filter.DelegatingFilterProxy
    </filter-class>
</filter> 

<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

Et voici mon spring-security.xml

<http auto-config="true">
    <intercept-url pattern="/*" access="ROLE_USER" />
    <form-login login-page="/login/login.jsp" 
                authentication-failure-url="/login/errorLogin.jsp"/>
    <logout logout-success-url="/" logout-url="/login/logout.jsp" />
</http>

<beans:bean id="myAuthenticationProvider" 
    class="myapp.web.authentication.WSAuthenticationProvider">
</beans:bean>

<authentication-manager>
    <authentication-provider ref="myAuthenticationProvider"/>
</authentication-manager>

Merci d'avance.

20
carcaret

logout-url fait référence à une URL virtuelle, vous n'avez besoin d'aucune ressource portant ce nom. Vous pouvez faire ceci:

<logout logout-success-url="/" logout-url="/j_spring_security_logout" />

et le lien sur votre page comme ça

<c:url value="/j_spring_security_logout" var="logoutUrl" />
<a href="${logoutUrl}">Log Out</a>

Ou ca:

<logout logout-success-url="/" logout-url="/logout" />

et le lien comme suit:

<c:url value="/logout" var="logoutUrl" />
<a href="${logoutUrl}">Log Out</a>

Vous mélangiez les deux et c'est pourquoi vous obteniez une erreur 404.

33
Ravi

vérifiez si csrf est activé. Si csrf est activé, vous devez utiliser la méthode post pour vous déconnecter, ajoutez le jeton csrf en tant que champ caché. puis utilisez JavaScript pour poster le formulaire de déconnexion

27
Jason Hao

Avec spring security 4 La déconnexion doit être effectuée via le bouton de formulaire. Le jeton CSRF doit être envoyé avec. j_spring_security_logout ne fonctionne plus. Après avoir passé une journée, je me suis mis à travailler.
Étape 1: Dans votre page JSP

<c:url var="logoutUrl" value="/logout"/>
<form action="${logoutUrl}" method="post">
    <input type="submit" value="Logout"/>
    <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
</form>

Étape 2

<security:http use-expressions="true">
<security:form-login login-page="/login" authentication-failure-url="/login?error=true" />
<security:logout logout-success-url="/login" invalidate-session="true" logout-url="/logout" />
</security:http>

Étape 3 Dans votre contrôleur de connexion

//Logout mapping
@RequestMapping("/logout")
public String showLoggedout(){
    return "logout";
}

Étape 4 Vous devez avoir un logout.jsp

Important de voir qu'il se posera sur la page de connexion après la déconnexion.

<security:form-login login-page="/login" authentication-failure-url="/login?error=true" />

Donc, cette page de connexion doit être là avec le mappage correspondant à login.jsp ou quoi que ce soit à mapper dans votre contrôleur.

17
vimal krishna

d'abord définir le code suivant avec security-context.xml ...

<security:logout logout-success-url="/"
            invalidate-session="true"  /> 

ajoutez ensuite ce code à votre fichier jsp.

  <script>
        function formSubmit() {
            document.getElementById("logoutForm").submit();
        }
    </script>


<c:url var="logoutUrl" value="/logout" />        
  <a href="javascript:formSubmit()"> Logout</a>
</li>

<form action="${logoutUrl}" method="post" id="logoutForm">
    <input type="hidden" name="${_csrf.parameterName}"     value="${_csrf.token}" />
</form>
0
torikraju

Dans la configuration Spring MVC basée sur Java, vous devez la configurer dans votre classe de configuration de sécurité:

@Override
protected void configure(HttpSecurity http) throws Exception {
    super.configure(http);
    http.servletApi().rolePrefix("");
    http
      .logout()
          .logoutRequestMatcher(new AntPathRequestMatcher("/logout"));
}

Cette réponse est doublée et travaille sur mon cas: Spring Security Java Config ne génère pas d’URL de déconnexion

0
Krystian

aussi heres ce que votre contrôleur devrait ressembler

@RequestMapping("/logout")
    public String logoutUrl(){
        return "logout";
    }
0