开发者学堂课程【Spring Security知识精讲与实战演示(一):Spring Security注销功能】学习笔记与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/730/detail/13036
Spring Security 注销功能
退出注销登录操作,即是注销。当我们点击注销,来到登录页面。虽然我们已经点击了注销,但是当我们再登陆,再访问时,还是可以直接访问,此时刚刚的注销操作是无效的,这是个假动作。我们在 pages 中的 header.jsp 里可以找到 login.jsp,
它是固定跳转到这里,所以此时它是不行的。我们可以把 login.jsp 改成 logout,此时这里的 logout 不是我们补充写的注销,是程序写的注销,后在RUN离进行刷新,再返回主业进行刷新,防止进行页面有缓存。当我们进行刷新后发现之前的在线已被清除。当我们再次进行登录时,再次点击注销,我们会发现页面显示 logout 不存在,
其实 logout 没有找到的原因并不是没有点击 logout,是因为在header 文件中,把csrf拦截开启了,只要 csrf 开启,默认情况下,logout 注销功能也不能使用 get 方式。此时是默认 get 方式,它认为注销对网站是具有一定危害性的,因为当它正在搜索时,我们把网站退出。所以它会要求你必须使用 post 方式。
所以我们刚刚用的 <%--href="${pageContext. request. contextPath)/logout"class="btn btn-default btn-flat">注销</ a>--%)就使用不了了,我们可以把它删除掉。
可以书写上form action="$ {pageContext.request. contextPath}/Iogout" method="post">
<input type="submit”value=“注销”>。
此时,当我们进行刷新,如果把 csrf 拦截关闭,即 disabled="true"处于放开状态,我们发现a标签中的get存在,是可以通过的,因为本来就无安全性可言。
当我们登录 ITCAST 后台管理系统,再次点击注销,这次是403,
在上述中我们改成 post 需要经过csrf和type,经过 csrf 需要我们在 <%@page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%> 后添加动态标签 <%@taglib uri=http://www.springframework.org/security/tags prefix="security"%。
之后在 <form action="${pageContext.request.contextPath}logout" method="post">后添加 <security:csrfInput/> 就携带了 csrf 的token。
我们在 div.navbar-custom-menu 中找到 Invalid CSRF token found for http://localhost:8080/logout。在nav.navbar.navbar-static-top中会有一个csrffilter.class,点击进入,我们会发现有 Invalid CSRF token found for,可以证明我们此时必须携带 token。http://localhost:8080/logout 可以看出我们没有携带 token。此时,我们返回到run进行刷新,当刷新完成后,再次登录ITCAST后台管理系统,登录完成后点击右上角 user,点击注销,页面会返回在登录 ITCAST 后台管理系统页面。注销功能需要我们注意的一点是,如果我们开启了 csrf Input,我们可以随意填写。若我们使用了 csrf Input,切记要加 token,若不加就会出错。


