如何使用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?