SpringBoot--- SpringSecurity进行注销,权限控制
SpringBoot--- SpringSecurity进行注销,权限控制
环境
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 都有为我们提供。
SpringBoot--- SpringSecurity进行注销,权限控制的更多相关文章
- SpringBoot + Security实现权限控制
网上找了好几个,因为各种原因不太行,下面这个亲测可行 参考:https://blog.csdn.net/u012702547/article/details/54319508 基于SpringBoot ...
- SpringBoot + SpringSecurity + Quartz + Layui实现系统权限控制和定时任务
1. 简介 Spring Security是一个功能强大且易于扩展的安全框架,主要用于为Java程序提供用户认证(Authentication)和用户授权(Authorization)功能. ...
- spring-security权限控制详解
在本例中,主要讲解spring-boot与spring-security的集成,实现方式为: 将用户.权限.资源(url)采用数据库存储 自定义过滤器,代替原有的 FilterSecurityInte ...
- spring-security 开启注解权限控制为什么没有效果
如果配置在spring-security中没有权限控制效果,可以配置在springmvc中试试 <security:global-method-security pre-post-annotat ...
- SpringSecurity 3.2入门(7)自定义权限控制介绍
总结Spring Security的使用方法有如下几种: 一种是全部利用配置文件,将用户.权限.资源(url)硬编码在xml文件中. 二种是用户和权限用数据库存储,而资源(url)和权限的对应关系硬编 ...
- springboot集成shiro 实现权限控制(转)
shiro apache shiro 是一个轻量级的身份验证与授权框架,与spring security 相比较,简单易用,灵活性高,springboot本身是提供了对security的支持,毕竟是自 ...
- 基于SpringSecurity实现RBAC权限控制(待完善)
Spring Security是一个为企业应用系统提供声明式的安全访问控制功能,减少为了企业应用系统安全控制而编写的大量重复代码. 认证: spring security的原理就是使用很多的拦截器对U ...
- Vue 动态路由的实现以及 Springsecurity 按钮级别的权限控制
思路: 动态路由实现:在导航守卫中判断用户是否有用户信息,通过调用接口,拿到后台根据用户角色生成的菜单树,格式化菜单树结构信息并递归生成层级路由表并使用Vuex保存,通过 router.addRout ...
- springboot + 注解 + 拦截器 + JWT 实现角色权限控制
1.关于JWT,参考: (1)10分钟了解JSON Web令牌(JWT) (2)认识JWT (3)基于jwt的token验证 2.JWT的JAVA实现 Java中对JWT的支持可以考虑使用JJWT开源 ...
随机推荐
- Go的安装和使用
1.安装环境 进入Golang官网,进入下载页面. (如果打不开可访问Golang中国,或者Golang中文版,或者百度网盘,提取码:wfw5) 根据实际需求选择版本进行下载. 运行下载好的MSI安装 ...
- jQuery中常用网页效果应用
一.常用网页效果应用 1.表单应用 表单由表单标签.表单域和表单按钮组成. 1.1单行文本框应用 例:获取和失去焦点改变样式 首先,在网页中创建一个表单,HTML代码如下 <form actio ...
- 大汇总 | 一文学会八篇经典CNN论文
本文主要是回顾一下一些经典的CNN网络的主要贡献. 论文传送门 [google团队] [2014.09]inception v1: https://arxiv.org/pdf/1409.4842.pd ...
- PHP is_uploaded_file() 函数
定义和用法 is_uploaded_file() 函数检查指定的文件是否是通过 HTTP POST 上传的. 如果文件是通过 HTTP POST 上传的,该函数返回 TRUE. 语法 is_uploa ...
- luogu P4798 [CEOI2015 Day1]卡尔文球锦标赛 dp 数位dp
LINK:卡尔文球锦标赛 可以先思考一下合法的序列长什么样子. 可以发现后面的选手可以使用前面出现的编号也可以直接自己新建一个队. 其实有在任意时刻i 序列的mex>max.即要其前缀子序列中1 ...
- Centos7 如何通过win10 的远程桌面连接进行远程访问
首先,如果安装测centos7是已经安装了GNOME 或者 KDE 桌面, 则只需要再安装xrdp就可以了. 直接通过yum install xrdp 是不行的,因为xrdp 不在默认源中 先配置 ...
- RNN神经网络产生梯度消失和梯度爆炸的原因及解决方案
1.RNN模型结构 循环神经网络RNN(Recurrent Neural Network)会记忆之前的信息,并利用之前的信息影响后面结点的输出.也就是说,循环神经网络的隐藏层之间的结点是有连接的,隐藏 ...
- PCL使用RANSAC拟合三位平面
1.使用PCL工具 //创建一个模型参数对象,用于记录结果 pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients); ...
- 2020牛客暑期多校训练营(第八场)K-Kabaleo Lite题解
K-Kabaleo Lite 题目大意: 给出每种菜品的利润以及碟数,要求我们给每个客人至少一碟菜,要求从1号菜品开始给,给的菜品的号码是连续的,每个客人同号码的菜都只能给一碟.求能招待客人的最大数量 ...
- 文件权限和访问控制列表ACL (1)
背景知识: 文件的权限主要针对三类对象进行定义 Owner: 属主u Group: 属组g Other: 其他o 每个文件针对每一类的访问者都设定了三种权限 r: Readable 读 w: Writ ...