Spring Security(8)
您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~
之前虽然实现了角色和权限之间的简单配对,但是如果每一个角色都要重新来过一次,就有点呆板了。如果能够配置一个「角色模板」,再通过这个模板来配置其他角色,岂不是更简单?Spring Security虽然没有角色模板,但可以通过「继承」的方式来「曲线就国」。
而且有时候角色与用户并不是完全一一对应的。比如,admin接口只有ROLE_ADMIN角色拥有,manager接口只有ROLE_MANAGER角色拥有。但其实admin是应该拥有manager的权限的。所以来看看怎么个「应该」法。
首先,在sys_suer表中增加employee用户:
INSERT INTO sys_user VALUES (3, 'employee', '123456', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP);
然后在sys_role表中增加ROLE_EMPLOYEE角色:
INSERT INTO sys_role VALUES (3, 'ROLE_EMPLOYEE', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP);
再在sys_permission权限表中增加角色权限:
INSERT INTO sys_permission VALUES (5,3,'/employee','read',CURRENT_TIMESTAMP,CURRENT_TIMESTAMP); INSERT INTO sys_permission VALUES (6,3,'/employee','remove',CURRENT_TIMESTAMP,CURRENT_TIMESTAMP);
修改LoginController,增加employee接口:
@GetMapping("/admin")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public String admin() {
return "admin有ROLE_ADMIN角色";
}
@GetMapping("/manager")
@PreAuthorize("hasRole('ROLE_MANAGER')")
public String manager() {
return "manager有ROLE_MANAGER角色";
}
@GetMapping("/employee")
@PreAuthorize("hasRole('ROLE_EMPLOYEE')")
public String employee() {
return "employee有ROLE_EMPLOYEE角色";
}
然后在WebSecurityConfiguration中引入Spring Security的RoleHierarchy角色继承类:
// 角色继承
@Bean
public RoleHierarchy roleHierarchy() {
RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl();
// 多个角色用【>】表示,【>】左边角色的权限要大于右边角色的权限
String hierarchy = "ROLE_ADMIN > ROLE_MANAGER " + System.lineSeparator() +
" ROLE_MANAGER > ROLE_EMPLOYEE";
// 也可以写成 "ROLE_ADMIN > ROLE_MANAGER > ROLE_EMPLOYEE";
roleHierarchy.setHierarchy(hierarchy);
return roleHierarchy;
}
通过Postman测试用户各自拥有的角色:
1、admin { ROLE_ADMIN, ROLE_MANAGER, ROLE_EMPLOYEE }
2、manager { ROLE_MANAGER, ROLE_EMPLOYEE }
3、employee { ROLE_EMPLOYEE }
可以看出来,Spring Security有几个特点:
1、角色可以被继承,但权限并不能“跟随”角色一起被继承
2、admin只能访问/admin/create和/admin/read这两个接口
3、manager也只能访问/manager/create和/manager/remove这两个接口
4、admin虽然继承了user的角色ROLE_MANAGER,但并没有显示地获得ROLE_MANAGER对应的权限,因为加入权限后,角色继承就会失效

因为权限无法跟随角色被继承,所以需要手动去完善权限。为了让admin也能访问manager的接口,要赋予角色更多的权限。现在把manager和employee的权限都赋予admin:
INSERT INTO sys_permission VALUES (7,1,'/manager','create',CURRENT_TIMESTAMP,CURRENT_TIMESTAMP); INSERT INTO sys_permission VALUES (8,1,'/manager','remove',CURRENT_TIMESTAMP,CURRENT_TIMESTAMP); INSERT INTO sys_permission VALUES (9,1,'/employee','read',CURRENT_TIMESTAMP,CURRENT_TIMESTAMP); INSERT INTO sys_permission VALUES (10,1,'/employee','remove',CURRENT_TIMESTAMP,CURRENT_TIMESTAMP);
然后在LoginController里再增加employee的权限:
@GetMapping("/employee/read")
@PreAuthorize("hasPermission('/employee', 'read')")
public String employeeRead() {
return "employee有ROLE_EMPLOYEE角色的read权限";
}
@GetMapping("/employee/remove")
@PreAuthorize("hasPermission('/employee', 'remove')")
public String employeeRemove() {
return "employee有ROLE_EMPLOYEE角色的remove权限";
}
通过admin登录,分别访问如下接口:

可以看到,admin已经有之前manager和employee的权限了。
Spring Security虽然比较简单,也很方便,多适用于一些比较小型的应用系统,角色简单,权限不多。如果要实现一些比较复杂的权限功能,Spring Security就会有点力不从心了,而且会出现诸如自定义filter被执行多次的问题。所以,一般在大型或企业级应用中,都不会,至少不会完全依赖Spring Security,而是依据实际业务需求,实现自定义的权限系统。
感谢您的大驾光临!咨询技术、产品、运营和管理相关问题,请关注后留言。欢迎骚扰,不胜荣幸~
Spring Security(8)的更多相关文章
- Spring Security(08)——intercept-url配置
http://elim.iteye.com/blog/2161056 Spring Security(08)--intercept-url配置 博客分类: spring Security Spring ...
- Spring Security(三)
Spring Security(三) 个性化用户认证流程 自定义登录页面 在配置类中指定登录页面和接收登录的 url @Configuration public class BrowserSecuri ...
- Spring Security(二)
Spring Security(二) 注:凡是源码部分,我已经把英文注释去掉了,有兴趣的同学可以在自己项目里进去看看.:-) 定义用户认证逻辑 用户登录成功后,用户的信息会被 Security 封装在 ...
- Spring Security(一)
Spring Security(一) 基本原理 前言 Spring Security核心功能 认证(你是谁) 授权(你能干什么) 攻击防护(防止伪造身份) Srping Security基本原理 项目 ...
- 【权限管理系统】Spring security(三)---认证过程(原理解析,demo)
在前面两节Spring security (一)架构框架-Component.Service.Filter分析和Spring Security(二)--WebSecurityConfigurer配 ...
- SpringBoot集成Spring Security(7)——认证流程
文章目录 一.认证流程 二.多个请求共享认证信息 三.获取用户认证信息 在前面的六章中,介绍了 Spring Security 的基础使用,在继续深入向下的学习前,有必要理解清楚 Spring Sec ...
- SpringBoot集成Spring Security(6)——登录管理
文章目录 一.自定义认证成功.失败处理 1.1 CustomAuthenticationSuccessHandler 1.2 CustomAuthenticationFailureHandler 1. ...
- SpringBoot集成Spring Security(5)——权限控制
在第一篇中,我们说过,用户<–>角色<–>权限三层中,暂时不考虑权限,在这一篇,是时候把它完成了. 为了方便演示,这里的权限只是对角色赋予权限,也就是说同一个角色的用户,权限是 ...
- SpringBoot集成Spring Security(4)——自定义表单登录
通过前面三篇文章,你应该大致了解了 Spring Security 的流程.你应该发现了,真正的 login 请求是由 Spring Security 帮我们处理的,那么我们如何实现自定义表单登录呢, ...
- SpringBoot集成Spring Security(2)——自动登录
在上一章:SpringBoot集成Spring Security(1)——入门程序中,我们实现了入门程序,本篇为该程序加上自动登录的功能. 文章目录 一.修改login.html二.两种实现方式 2. ...
随机推荐
- SDN实验环境安装配置
- C语言大作业---学生信息管理系统
xxxx信息管理系统 简介 因为大作业规定的踩分项就那么多,为了不浪费时间 + 得分,就写成这样.现在看看,命名不规范,书写风格糟糕,全塞在一个源代码中······ 不过,应付大作业是没问题的 实验报 ...
- 【项目实战】用Pytorch实现线性回归
视频教程:https://www.bilibili.com/video/BV1Y7411d7Ys?p=5 准备数据 首先配置了环境变量,这里使用python3.9.7版本,在Anaconda下构建环境 ...
- windows系统下使用bat脚本文件设置 tomcat 系统环境变量
说明:在一个bat文件中设置tomcat环境变量后,不能直接使用,需要另起一个bat文件才能使用 号开头的行不要写在bat文件中 # tomcat1.bat # 这个bat文件实现的功能:设置环境变量 ...
- Linux 宝塔部署 ASP.NET Core 应用
第一步,发步应用 我这是一个API 应用和 MVC 应用 设置,服务器上要运行的端口 API 端口5000 MVC 端口5001 打包文件夹,发步 1.桌面新建俩个文件夹 2.右键项目发步,选中iis ...
- STM32F10x SPL V3.6.2 集成 FreeRTOS v202112
STM32F10x SPL 集成 FreeRTOS 在整理 GCC Arm 工具链的Bluepill代码示例, 常用外设都差不多了, 接下来是 FreeRTOS, 网上查到的基本上都是基于旧版本的集成 ...
- 【博学谷学习记录】超强总结,用心分享|MySql连接查询超详细总结
一.概述 在实际开发中,大部分情况下都不是在单表中进行数据操作,一般都是多张表进行联合查询.通常一个业务就会对应的有好几张表.MySql中的连接查询分为交叉连接,内连接,外连接三部分.其中交叉连接也叫 ...
- HFS局域网分享文件的神器(附下载链接)
温馨提示,下载链接在页末 前言 假如说你需要传递个学习资料给好基友,我们有许多种方式可选:硬盘媒介.网络分享等. 要是论速度,还是得拿3.0或以上的U盘来拷贝,确实神速哈哈.但是其也有局限性,比如需要 ...
- git clone开启云上AI开发
摘要:相比于传统的软件开发,AI开发存在以下4个痛点:算法繁多:训练时间长:算力需求大:模型需手动管理,我们可以使用云上AI开发的方式来缓解以上4个痛点. 本文分享自华为云社区<git clon ...
- 安装notepad++ 安装Python Python环境变量的数值。怎样在notepad++上运行Python的代码
文章目录 1.下载安装一个Python的编辑器notepad++,(我这里有现成的,也可以去网上搜很多) 2.安装python,(我这里有现成的,也可以去网上下载). 3.怎样彻底删除Python,有 ...