SpringBoot--- SpringSecurity进行注销权限控制的配置方法
作者:凌丹妙 发布时间:2022-11-11 03:49:54
环境
IDEA :2020.1
Maven:3.5.6
SpringBoot: 2.0.9 (与此前整合的版本2.3.3 不同,版本适配问题,为配合使用降级)
1、注销
这里也有一个前提问题需要注意,我们登录操作都是在开启防跨域攻击的环境下进行的。
毫无疑问,注销也是在这样的情况下进行的。
登录时我们提交表单,采用 POST 方法传输,通过使用 Thymeleaf 在 form 表单添加 th:action 元素,Thymeleaf 会自动为我们添加 _csrf 元素。
同样注销操作也是要带有 _csrf 参数认证的。
<form th:action="@{/logout}" method="post">
<button type="submit" >注销</button>
</form>
我们把它做成一个表单按钮,同时采用 POST 方法传输,使用 SpringSecurity 提供的默认 /logout 方法进行登出注销。
开发者是不需要在 Controller 配置这个 /logout 方法处理的,和 /login 一样,这是由 SpringSecurity 提供的。
我们需要在之前登陆的配置类配置登出的各种属性即可。
.and() //这里采用链式编程
.logout()
.logoutSuccessUrl("/index") //注销成功后,调转的页面
/* .logoutUrl() 配置自己的注销URL,默认为 /logout
.invalidateHttpSession() 是否销毁session,默认ture
.deleteCookies() 删除指定的cookies
销毁session 相信很容易理解,一次对话,可以注销关闭,或者关闭页面会自动销毁。
记住我
cookies 需要重点介绍一下,这也是我们常用的记住我,在关闭页面或浏览器之后,下次打开页面时,是以之前登录的用户登录的。
为此,我们需要在登录表单增加记住我选项
tr>
<td>
<input type="checkbox" name="remember-me">
</td>
<td>Remember me on this computer.
</td>
</tr>
同时在配置类开启记住我。
.and()
.rememberMe();
这里 checkbox 的 name 我们使用默认的 remember-me ,同样这一 cookies 的 name 也会被浏览器记住,这样我们只需要开启记住我即可使用。
如果不使用 name= "remember-me" ,而是使用其他 name 属性值,则需要配置指定,以便 SpringSecurity 接收是否记住我。
.and()
.rememberMe().rememberMeParameter("rememberme");
//接收前端自定义记住我的name<input name="rememberme">,默认是remember-me
回到 deleteCookies() 方法的配置上,要销毁指定的 cookies ,我们要指定cookies 的名字即可。
.and()
.logout().logoutSuccessUrl("/index").deleteCookies("remember-me")
//销毁 name="remember-me"的 cookies
浏览器登录,选用记住我
登录后, F12,查看 cookies
第一个为 cookies,第二个则是此次会话的 session 对象。
可以看到 cookies 是有限期的,默认为 14 天。
点击注销。
由于配置了删除 cookies,cookies 已经被删除。
重新登录,这次没有选记住我,同时 session 也已经不是同一个,值已经改变了。
2、权限控制
同时,页面还有一个重要的需求没有实现。
没有某一权限的用户,不应该看到点击的入口(武功秘籍)。所谓得不到的最想要,你这不是摆着馋他嘛!可不能把他害咯。
对此,我们可以结合 Thymeleaf 和 SpringSecurity 实现哪些用户可以看到哪些内容。
首先,我们要导入 thymeleaf-springsecurity 整合的依赖
<!-- thymeleaf-springsecurity整合-->
<!-- https://mvnrepository.com/artifact/org.thymeleaf.extras/thymeleaf-extras-springsecurity4 -->
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-springsecurity4</artifactId>
<version>3.0.4.RELEASE</version>
</dependency>
同时还要在页面标签导入命名空间
<html xmlns:th="http://www.thymeleaf.org"
xmlns:sec="https://www.thymeleaf.org/thymeleaf-extras-springsecurity4">
在页面下把需要权限限制的内容包起来
<div sec:authorize="!isAuthenticated()">
<h2 align="center" >游客您好,如果想查看武林秘籍
<a th:href="@{/toLogin}">请登录</a>
</h2>
</div>
sec:authorize="!isAuthenticated()" 表示未登录认证的用户才可以查看到的内容。
<div sec:authorize="isAuthenticated()">
<a>
Count: <span sec:authentication="name"></span>
</a>
<form th:action="@{/logout}" method="post"><!--只能通过表单加 -csrf 认证,其他(超链接)无法添加-->
<button type="submit" >注销</button>
</form>
</div>
sec:authorize="isAuthenticated()" 表示已经登录认证的用户才可以查看到的内容。
sec:authentication="name" 表示获取认证的用户的用户名。
唉,别忘了,重点,有些武功秘籍不能让没有权限的用户看到,比如 level2 的,像什么太极拳,七伤拳,梯云纵。哈哈哈
<div sec:authorize="hasRole('level2')">
<h3>高级武功秘籍</h3>
<ul>
<li><a th:href="@{/level2/1}">太极拳</a></li>
<li><a th:href="@{/level2/2}">七伤拳</a></li>
<li><a th:href="@{/level2/3}">梯云纵</a></li>
</ul></div>
sec:authorize="hasRole('level2')" 规定只有 level 2 权限的用户才能查看。
其他的可以此类推做出配置。
除此之外,还可以有其他定制化配置,权限(role),权力(authority),IP ,是否允许(permission)。
spring security 5.1.6版本,从源码的角度可以看出使用不同的hasAuthority、hasRole方法判断权限时的区别,其实他们最终调用的都是hasAnyAuthorityName()方法,唯一不同的就是hasRole()在调用时,传递了前缀defaultRolePrefix,这就导致了他们两者之间比较的字符产生了差异。spring security应该想代表的意思就是权限字符加了ROLE_就是角色Role,如果没有加就是一个权限Authority。
SpringSecurity 都有为我们提供。
来源:https://www.cnblogs.com/l1ng14/p/13535801.html


猜你喜欢
- 最近,在与同事进行协同编程时,我们开始讨论在C#中初始化新对象的最佳方法。我一直是使用构造函数实现,尽管他倾向于静态工程方法。这引起了关于每
- Ben Evans是一名资深培训师兼顾问,他在演讲可视化垃圾回收中从基础谈起讨论了垃圾回收。以下是对其演讲的简短总结。基础当谈到释放不再使用
- 作者: juky_huang 事件的简单解释: 事件是对象发送的消息,以发信号通知操作的发生。操作可能是由用户交互(例如
- 1.为什么要 token自动续期token中一般会包含用户的基本信息,为了保证token的安全性,一般会将token的过期时间设置的比较短,
- 公司有个业务需要查出所有的用户权限分类,并将最后一层类别所包含的权限查出来。数据库说明,有一个parent_id 字段是最好的:、paren
- java 高并发中volatile的实现原理摘要: 在多线程并发编程中synchronized和Volatile都扮演着重要的角色,Vola
- 接触Spring快半年了,前段时间刚用Spring4+S2H4做完了自己的毕设,但是很明显感觉对Spring尤其是IOC容器的实现原理理解的
- 根据数据库表名生成实体类公司用的jpa,没有用mybatis。所以也没有用mybatis自动生成。但有些数据库表字段太多,就想着一劳永逸了,
- 在使用Unity中的Debug.Log()进行日志输出时很不方便,在打包出来的可执行文件中没有办法看到输出,所有就想自己实现一个简易的日志输
- 本文实例为大家分享了Android实现蓝牙串口通讯的具体代码,供大家参考,具体内容如下最近在弄蓝牙串口,参考了不少网上的大佬,加上自己早期对
- 最近 IDEA 2020最后一个版本发布了 ,已经内置了Lombok插件,SpringBoot 2.1.x之后的版本也在Starter中内置
- 代码测试可用,运行结果非常辣眼睛,有种二十一世纪初流行于广大中小学生之间的失落非主流的感觉!还是比较有参考价值的,获取当前日期时间,日期类格
- 当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模
- 1.背景Java语言相比于C和C++,一个最大的特点就是不需要程序员自己手动去申请和释放内存,这一切交由JVM来完成。在Java中,运行时的
- 目录No1. 自定义控件模板No2. 重写控件No3. 附加属性来试试总结文章默认你已经入门WPF了WPF日常开发,经常遇到默认的控件功能不
- MapReduce的原理MapReduce由两个主要阶段组成:Map和Reduce。在Map阶段中,数据集被分成若干个小块,每个小块由Map
- 根据UGUI的射线检测机制获取当前鼠标下的UI:/// <summary> /// 获取鼠标停留处UI
- package com.jjinfo.common.util; import java.util.Arrays; import java.u
- 一、前言高效、合理的使用hibernate-validator校验框架可以提高程序的可读性,以及减少不必要的代码逻辑。接下来会介绍一下常用一
- 前言大家都知道Android Studio目前已经更新到2.0 Preview 6了,作为Google大力推崇的开发工具,相对于Eclips