Spring Security:退出还没有工作 - "请求的资源不可用"

时间:2015-11-03 20:12:05

标签: spring spring-mvc spring-security

所以,我试图让我的第一个练习应用程序与Spring Security一起工作。在进行更复杂的实现之前,这只是一个简单的测试,试着看看我是否能够完成基础工作。

我使用Spring Security 4 btw,使用Spring 4.2.2。

现在,我有一个欢迎页面和一个管理页面。拦截尝试访问管理页面并将其重定向到默认的Spring Security登录表单。从那里,我可以登录并进行身份验证以访问管理页面。

在管理页面上,我有一个注销链接。这是它出错的地方。我现在有两个退出链接,我尝试过这两种不同的方法。

第一个是简单的URL。它使用标签,其中是JSTL标签。我试图在那里调用注销URL。当我这样做时,我得到一个HTTP状态404页面,其中包含描述所请求的资源不可用的信息。

第二种方式是表格。我尝试在表单中设置一个提交按钮,其中表单的action属性设置为注销URL,方法设置为post。

这个给了我一个更复杂的错误,我将在这里复制并粘贴:

标题:HTTP状态403 - 无效的CSRF令牌' null'在请求参数' _csrf'上找到或标题' X-CSRF-TOKEN'。

类型:状态报告

消息:无效的CSRF令牌' null'在请求参数' _csrf'上找到或标题' X-CSRF-TOKEN'。

描述:禁止访问指定的资源。

在两种情况下,错误页面的URL(btw)都是localhost:8080 / spring-security / logout。 spring-security是这个测试应用程序的名称。

所以,我有点失落。这是我第一次使用Spring Security,我真的不知道自己做错了什么。任何帮助将不胜感激。

下面我粘贴了我的admin.jsp页面和spring-security.xml页面。

提前致谢。

admin.jsp页面:

<%@ page session="true" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<%@ include file="jstl-stub.jsp" %> <!-- Include links to JSTL Libraries -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Admin Page</title>
</head>
<body>

<h1>Title: ${title}</h1>

<h1>Message: ${message}</h1>

<c:if test="${pageContext.request.userPrincipal.name != null}">
    <h2>Welcome: ${pageContext.request.userPrincipal.name}
    | <a href="<c:url value="/logout"/>">Logout</a></h2>

    <br><br>

    <form action="logout" method="post">
        <input type="submit" value="logout"/>
    </form>
</c:if>

</body>
</html>

弹簧security.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:security="http://www.springframework.org/schema/security"
xsi:schemaLocation="http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-4.0.xsd
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd">

<security:http auto-config="true">
    <security:intercept-url pattern="/admin" access="hasRole('ROLE_USER')"/>
    <security:logout logout-url="/logout" logout-success-url="/welcome"/>
</security:http>

<security:authentication-manager>
    <security:authentication-provider >
        <security:user-service>
            <security:user name="user" password="password" authorities="ROLE_USER"/>
        </security:user-service>
    </security:authentication-provider>
</security:authentication-manager>

</beans:beans>

2 个答案:

答案 0 :(得分:1)

我认为第二个问题是你的post方法。我看到你使用的是安全4.0,默认情况下4.0启用了csrf保护。如果你不想拥有它,你必须禁用它。

  

从Spring Security 4.0开始,默认情况下启用CSRF保护   XML配置。如果你想禁用CSRF保护,那么   相应的XML配置如下所示。

<http>
  <!-- ... -->
  <csrf disabled="true"/>
</http>

见下面的链接 http://docs.spring.io/spring-security/site/docs/4.0.x/reference/htmlsingle/#csrf-configure

但是如果你想添加csrf保护,你需要在post方法中添加标题。

本教程可以为您提供帮助。

http://myshittycode.com/2015/03/30/spring-security-invalid-csrf-token-null-was-found-on-the-request-parameter-_csrf-or-header-x-csrf-token/

答案 1 :(得分:0)

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.csrf().disable();
    // other code ...
}

禁用csrf将为您工作。并允许您通过get方法调用/logout