Spring 安全注销转到 j_spring_security_logout

Posted

技术标签:

【中文标题】Spring 安全注销转到 j_spring_security_logout【英文标题】:Spring security logout goes to j_spring_security_logout 【发布时间】:2014-05-01 11:52:14 【问题描述】:

在我的 Web 应用程序中,当我尝试注销时,它会转到 j_spring_security_logout 而不是给定的页面。 在我添加的spring-security.xml 页面中

<logout logout-success-url="/login" delete-cookies="JSESSIONID" />

问题是,当我使用 spring security 3.1.4.RELEASE 版本时,它更早地工作了。 现在我正在使用 3.2.2.RELEASE

我也尝试了以下方法。没用

<logout logout-url="/logout" delete-cookies="JSESSIONID" />

spring-security.xml

<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
       http://www.springframework.org/schema/security
       http://www.springframework.org/schema/security/spring-security.xsd">

<http auto-config='true'>
    <intercept-url pattern="/login*" access="IS_AUTHENTICATED_ANONYMOUSLY" />
    <intercept-url pattern="/**" access="ROLE_USER" />
    <form-login login-page="/login" default-target-url="/transaction-view"
        always-use-default-target="true" authentication-failure-url="/loginfailed" />
    <logout logout-url="/logout" logout-success-url="/login.jsp" delete-cookies="JSESSIONID" />
    <session-management invalid-session-url="/invalidSession.htm">
        <concurrency-control max-sessions="1"
            error-if-maximum-exceeded="true" /> <!--this will throw error to second login attempt -->
    </session-management>
    <!-- <custom-filter before="FORM_LOGIN_FILTER" ref="myFilter" /> -->
    <csrf />
</http>

<beans:bean id="customSecurityService"
    class="com.fg.monitoringtool.web.security.SecurityService"></beans:bean>
<beans:bean id="passwordEncoder"
    class="com.fg.monitoringtool.web.security.PasswordEncoderMD5"></beans:bean>


<authentication-manager alias="authenticationManager">
    <authentication-provider user-service-ref="customSecurityService">
        <password-encoder ref="passwordEncoder">
        </password-encoder>
    </authentication-provider>

</authentication-manager>

提前致谢。

【问题讨论】:

您能发布完整的 Spring-Security 配置吗? 您的注销 html 代码是什么?您是否启用了 CSRF 保护? @holmis83 是的,它的 CSRF 保护已启用。链接是 "> 试试 @geo 不工作,仍然去 j_spring_security_logout 【参考方案1】:

使用默认注销 url 的更好方法是

<c:url var="logoutUrl" value="j_spring_security_logout"/>
<form action="$logoutUrl" method="post">
  <input type="submit" value="Log out" />
  <input type="hidden" name="$_csrf.parameterName" value="$_csrf.token"/>
</form>

【讨论】:

测试了一个不工作。我不会否决它,因为这可能是我的安全配置,但接受的解决方案正在工作【参考方案2】:

启用 Spring Security CSRF 保护后,必须使用 POST 注销:

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

【讨论】:

非常感谢您的回答。这就是问题所在。由于 CSRF 启用,我无法直接访问链接。您的解决方案正在运行。谢谢 谢谢!我为此工作了大约半个小时。我不知道为什么它不再工作了。

以上是关于Spring 安全注销转到 j_spring_security_logout的主要内容,如果未能解决你的问题,请参考以下文章

Spring安全中的登录注销用例

Spring CSRF 覆盖安全 XML 配置中的“POST”注销行为

Spring Security——认证授权注销及权限控制

如何使用xml在spring security中禁用注销确认?

spring security - 如何让另一个用户注销

使用 Spring MVC 和 Spring Security 进行 404 注销