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

Posted

技术标签:

【中文标题】如何使用xml在spring security中禁用注销确认?【英文标题】:How to disable logout confirmation in spring security using xml? 【发布时间】:2020-01-31 09:45:57 【问题描述】:

我已将 Spring 安全性从 4.x 更新到 5.x。现在,我遇到了 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-4.2.xsd">


    <http auto-config="true" use-expressions="true">
        <!-- isAnonymous() -->
        <intercept-url pattern="/**/add/**" access="isAuthenticated()" />
        <intercept-url pattern="/**/delete/**" access="isAuthenticated()" />
        <intercept-url pattern="/**/update/**" access="isAuthenticated()" />
    </http>

    <authentication-manager>
        <authentication-provider>
            <user-service>
                <user name="uzer64" password="noop123456" authorities="ROLE_USER" />
                <user name="admin" password="noopadmin" authorities="ROLE_ADMIN" />
            </user-service>
        </authentication-provider>
    </authentication-manager>
</beans:beans>

【问题讨论】:

这不是 Spring Security 屏幕,仅在发布请求时注销。所以该屏幕必须在您自己的应用程序中。 我知道你想要什么,但它不是 Spring Security 的东西,它在你自己的应用程序代码中。因此,您需要修复您的应用程序而不是 spring 安全配置,因为这无济于事。 @M.Deinum 是spring security提供的屏幕,我的回答中已经解释过了。 正如我解释的那样,Spring Security 没有注销确认屏幕/对话框。所以试图在 Spring Security 中解决这个问题并不是解决方案。 【参考方案1】:

您可以尝试以下方法:-

    <logout
    logout-success-url="/anonymous.html"
    logout-url="/perform_logout" /> 

您可以提及要重定向的网址。您也可以添加 delete-cookies="JSESSIONID" 用于删除 cookie。

【讨论】:

【参考方案2】:

这是一个 CSRF 功能,用于避免来自其他站点的恶意 javascript 发起的注销请求。 您的请求是 GET: /logout,因此 spring security 希望通过点击等用户操作来确认它。

所以要避免它。您的注销请求应为 POST 并包含有效的 _csrf 令牌。

您可以通过使用 spring 表单标签和下面给出的方法 post 来实现它

<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
...
<form:form action="$pageContext.request.contextPath/logout" 
           method="post" modelAttribute="AnyModelAttributePassedFromController">
    <form:button value="submit"> Logout</form:button>
</form:form>
...

或者

<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
...
<form:form action="$pageContext.request.contextPath/logout" 
           method="post" modelAttribute="_csrf">
    <form:button value="submit"> Logout</form:button>
</form:form>
...

【讨论】:

Spring Security 默认只接受 POST 注销请求。 LogoutFilter 忽略或至少不处理其他所有内容。 我同意 Spring Security 默认只处理注销后,即使我同意你提到的修复不适用于 Spring Security 配置的评论,修复应该在你的代码中完成。我解释了为什么它只允许 POST 请求。我只是想提一下logout confirmation prompt box is provided by spring security but not from his code 不,不是。 Spring Security 不提供注销确认提示。 @M.Deinum 是的。 Have a look at source code 作为新/更新的 OAuth2 支持的一部分已在 5.1 中添加(显然在更改日志中错过了这一点)。然后解决方案是禁用表单登录(仅在不使用时适用)或确保使用 POST(如您的回答中所述)。今天又学到了一些关于 Spring Security 的知识:)。【参考方案3】:
@Override
    protected void configure(HttpSecurity http) throws Exception 
        http
            .logout()
                .logoutRequestMatcher(new AntPathRequestMatcher("/logout"));
    

它对我有用。

【讨论】:

也为我工作,谢谢...

以上是关于如何使用xml在spring security中禁用注销确认?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Java 和 XML 配置在 Spring Security 中配置 jdbc 身份验证管理器?

如何使用 Spring Session + Spring security xml 配置和多重安全过滤器

如何使用 XML 使用 Spring Security Oauth2 启用 /oauth/check_token

如何通过 XML 配置仅针对特定 URL 模式在 Spring Security 4 中禁用 CSRF?

如何强制 Spring Security OAuth 2 使用 JSON 而不是 XML?

在项目中使用Spring Security进行权限控制