【问题标题】:Issue with Spring security's logoutSpring security 的注销问题
【发布时间】:2011-03-05 08:40:57
【问题描述】:

我在 Spring 框架中注销时遇到问题。

首先,当我希望 j_spring_security_logout 为我处理它时,我得到 404 j_spring_security_logout not found: 示例-security.xml:

<http>
    <intercept-url pattern="/messageList.htm*" access="ROLE_USER,ROLE_GUEST" />
    <intercept-url pattern="/messagePost.htm*" access="ROLE_USER" />
    <intercept-url pattern="/messageDelete.htm*" access="ROLE_ADMIN" />
    <form-login login-page="/login.jsp" default-target-url="/messageList.htm"
        authentication-failure-url="/login.jsp?error=true" />
    <logout/>
</http>

JSP 页面中用于注销的示例 url 链接:

<a href="<c:url value="/j_spring_security_logout" />">Logout</a>

当我尝试使用自定义 JSP 页面时,即为此目的使用登录表单时,我会得到更好的结果,至少它可以进入登录页面,但另一个问题是你不会被注销,因为你可以直接输入应该保护的网址无论如何你都可以通过它。

对之前的列表稍作修改:

<http>
    <intercept-url pattern="/messageList.htm*" access="ROLE_USER,ROLE_GUEST" />
    <intercept-url pattern="/messagePost.htm*" access="ROLE_USER" />
    <intercept-url pattern="/messageDelete.htm*" access="ROLE_ADMIN" />
    <form-login login-page="/login.jsp" default-target-url="/messageList.htm"
        authentication-failure-url="/login.jsp?error=true" />
    <logout logout-success-url="/login.jsp" />
</http>
<a href="<c:url value="/login.jsp" />">Logout</a>

感谢您的帮助

【问题讨论】:

  • 嗨,我已经完成了 javascript 并传递了 csrf 令牌,但是一旦注销我就无法再次登录.. 注销后我的登录页面显示了一些 csrf 令牌,这与当我不同时重新加载登录页面,无法再次登录,提示http://192.168.6.51:8044/EWTS/auth/login_check;jsessionid=403A583CDDC688292408C7C76CD09F2D?targetUrl= not found
  • 注销后如何移除csrf token???

标签: spring-security


【解决方案1】:

在您的页面中尝试此链接,其中包含注销链接:

<h:outputLink value="#{request.contextPath}/logout.jsp">Logout</h:outputLink>

并使用以下代码在您的“webcontent”文件夹中创建一个 logout.jsp 文件:

<% response.sendRedirect("/#{request.contextPath}/j_spring_security_logout"); %>

如果发生错误,请尝试将“#{request.contextPath}”更改为您的项目名称 例如:我的项目名称是“security”,所以我在 logout.jsp 文件中使用:

<% response.sendRedirect("/security/j_spring_security_logout"); %>

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,在失去希望之后,我终于偶然找到了答案。 当然,通过阅读和使用其他人的代码,我们学到了很多东西,并且通过这样做,我们继承了我们不太了解的设置。

    这就是我在使用 Spring Security 编程时发生的事情。

    在 Spring Security XML 中,在 http 标记内,有这样一行:

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

    我在研究过程中从一些教程或示例中得到了这条线。在与 j_spring_security_logout 关键字苦苦挣扎 2 天后,除了错误 404 什么也没有得到,我想通了。

    在我使用的 logout 标记中,有这个 logout-url 参数设置为“/logout”。然后我意识到根据我的设置,我的 spring 期望接收 /logout 而不是 /j_spring_security_logout

    一旦我相应地更新了我的代码,它就像一个魅力。

    【讨论】:

    • Spring 如何知道要注销哪个用户?不应该发送用户名之类的吗?
    • 无法登录具有两个不同用户的系统。当您登录时,Spring 将您的用户保留在浏览器的会话中,这就是已注销的会话。
    • 工作就像一个魅力。我犯了同样的错误,我没有添加 logout-url="/j_spring_security_logout"
    【解决方案3】:

    你应该做 POST 请求。类似的东西:

    <form action="${logoutUrl}" method="post" id="logoutForm">
                <input type="hidden" 
                        name="${_csrf.parameterName}"
                        value="${_csrf.token}" />
    </form>
    
    <script>
        function formSubmit() {
                    document.getElementById("logoutForm").submit();
        }
    </script>
    
    <c:if test="${pageContext.request.userPrincipal.name != null}">
               <h2>
                    Welcome : ${pageContext.request.userPrincipal.name} | 
                     <a href="javascript:formSubmit()"> Logout</a>
                </h2>
    </c:if>
    

    【讨论】:

      【解决方案4】:

      我刚遇到这个问题。

      您需要确保在web.xml 中您的安全过滤器与 url /j_spring_security_logout 匹配

      例如

      <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>/j_spring_security_logout</url-pattern>
      </filter-mapping>
      

      【讨论】:

        【解决方案5】:

        我遇到了同样的问题。

        似乎是 3.0.6 的一个错误!

        我刚刚降级到 3.0.5,一切正常。

        【讨论】:

          【解决方案6】:

          注销链接是否知道上下文路径?

          例如,如果你的上下文路径是“myapp”,那么上面提到的链接指向哪里?

          “http://localhost:8080/myapp/j_spring_security_logout”还是“http://localhost:8080/j_spring_security_logout”?

          事实上,j_spring_security_logout 只在 webapp 的上下文中有效,所以只有第一个链接会导致正确的 url

          【讨论】:

            猜你喜欢
            • 2017-04-22
            • 2011-03-09
            • 1970-01-01
            • 2016-10-28
            • 2016-07-05
            • 2013-09-30
            • 1970-01-01
            • 2020-04-02
            • 2012-10-09
            相关资源
            最近更新 更多