当前位置: 首页 > news >正文

SpringSecurity(3)学习内容

权限配置

用户的权限配置主要分两种,一种就是给用户分配角色,不同的角色有不同的操作权限。另外一种就是直接分配能够操作的权限,该方式权限的颗粒度更小,权限分配更精细化。在不同的场景下两种权限配置都要用到。

准备工作:

如果我们要学习用户的权限配置,那么我们首先要清楚用户与角色,权限之间的关系,也就是说,如果有用户表,角色表,权限表,这三个表之间的关系是什么呢?

不难理解:

用户表和角色表之间应该是多对多,也就是说一个用户可以有多个角色,那么同时一个角色可以对应多个用户。

角色表与权限表之间也应该是多对多,也就是说一个角色可以有多个权限,那么同时一个权限也可以对应多个角色。

如图:

一、角色权限配置

1.1 创建表

用户表

用户角色关系表

角色表

1.2 通过逆向工程生成

通过逆向工程生成t_role的相关实体,mapper及映射文件

1.3 角色权限需求

用户(登录认证成功 )--> 给用户配置角色 --> 给角色配置能访问的资源

1.4 角色权限步骤

(1)、需要有一个用户;(从数据库查询用户)

(2)、给用户配置角色;(从数据库查询用户的角色)

(3)、给角色配置能访问的资源(这一步采用切面拦截,使用的是注解)

RBAC (基于角色的访问控制)

常用注解如下:

@PreAuthorize 在方法调用前进行权限检查;(常用)

@PostAuthorize 在方法调用后进行权限检查;(很少用)

如果需要如上两个注解生效,需要在security的配置类上添加如下注解使其生效:

@EnableMethodSecurity

注解的详细用法:

@PreAuthorize("hasRole('xxx')")@PreAuthorize("hasAuthority('xxx')")都是用于方法级权限控制的注解,但它们在权限标识的处理上存在关键区别,核心在于角色(Role)和权限(Authority)的语义与格式差异

@PreAuthorize("hasRole('admin')"):一般用来做角色的授权行为

@PreAuthorize("hasAuthority('xxx')"):一般来做资源的授权定位

本质区别:角色与权限的语义

  • hasRole('角色名'):专门用于判断用户是否拥有某个角色

Spring Security 会自动为角色名添加前缀ROLE_(默认配置),因此实际校验的权限是ROLE_角色名

比如某个用户拥有角色为admin,那么框架实际验证的是ROLE_admin,因此我们需要在做角色授权的时候自己加上ROLE_。 这是因为Spring Security框架内的DefaultMethodSecurityExpressionHandler
在验证表达式时是有”ROLE_”前缀的。

  • hasAuthority('权限名'):用于判断用户是否拥有某个具体权限
    不会对权限名做任何处理,直接校验用户是否包含该权限字符串。

可以自定义前缀:

1.5 具体实现

如果需要看某个用户是否拥有某个角色,我们是不是应该有一个数据库查询,根据用户id查询角色信息呢?

而逆向工程中是没有这个操作的,因为这是一个联表查询

TRoleMapper中添加通过用户id查询角色信息的抽象方法

1.5.1 根据用户id查询角色信息

1.5.2 映射文件

1.5.3 给用户配置角色

1.5.4 自定义Service赋值角色

1.5.5 自定义Controller相关方法

创建新的ProductController进行测试

注意:需要在配置类中添加注解表示开启注解支持

测试结果如下:

当前访问 http://localhost:8080/index1 地址时先进行用户的认证

用户认证成功后,获取用户的详细信息

由于liutao是销售员当访问 http://localhost:8080/product/list 请求时发现可以正常访问

当访问 http://localhost:8080/product/add 请求时发现可以正常访问

当访问 http://localhost:8080/product/del 请求时发现无法正常访问,说明没有权限

以上是我们使用liutao用户去测试的,该用户有saler角色,但是没有admin角色。

1.5.6 定义错误页面

再次访问 http://localhost:8080/product/del 请求时发现无法正常访问时跳转到权限不足的403页面。

二、资源权限配置

数据表设计:(权限表),(权限和角色的中间表)

剩下的和角色配置大致一致,不同的是注解使用@PreAuthorize("hasAuthority('xxx')")就可以了

步骤:

  • 逆向工程生成权限的实体,Mapper接口 和 映射
  • 添加方法,通过用户ID查询所有的权限(5表联合查询)/同样在用户实体中添加权限的集合
  • 给用户配置权限 用户实体中/自定义service中
  • 添加controller相关方法测试

逆向工程

2.1 Mapper编写以及映射文件

Mapper接口

Mapper映射文件

2.2 给用户配置权限

2.2.1 给实体User中添加临时的权限集合属性

2.2.2 给用户授予权限

2.2.3 给User实体中的权限集合赋值

通过数据库查询然后给属性赋值

2.2.4 设定场景测试

测试结果如下:

当前访问 http://localhost:8080/index1 地址时先进行用户的认证

用户认证成功后,获取用户的详细信息

证成功后,可以看到 liutao 当前用户的权限 有 增改查 权限操作,没有删除权限。

先测试下 增改查 的某一个功能,http://localhost:8080/goods/list 结果如下图:

通过测试 http://localhost:8080/goods/del 删除功能时结果如下图:

此时发现当前用户尚未拥有删除权限,无法执行删除操作。

http://www.jsqmd.com/news/619629/

相关文章:

  • fre:ac音频转换器:3大核心功能让你的音乐管理焕然一新
  • 从Vivado工程到上电自启:ZYNQ7020双核ARM+FPGA的完整启动流程详解
  • EC-QA-04-质量问题跟踪表
  • 3分钟掌握G-Helper:终极华硕笔记本性能优化指南
  • 单相全桥逆变器Simulink仿真分析与MATLAB实现探索
  • 智能销售辅助在机械设备行业转化率突破:从经验依赖到AI赋能的革命性转型
  • 基于单片机控制的汽车电动车窗
  • 现在不重构组织,Q3将面临AI人才断层潮:SITS2026圆桌披露的21天敏捷转型启动清单
  • 解密WarcraftHelper:现代系统兼容方案让经典魔兽争霸3重获新生
  • 西门子PLC 1200与V20变频器USS通讯项目:包含实际程序、CAD图纸及详细注释
  • 避开这些坑!Applied Intelligence投稿6中5后,我总结的格式与语言避雷指南(附Decision Letter模板)
  • 高效管理:IP-Guard客户端批量部署的三种核心方案详解
  • 5分钟掌握Win11Debloat:免费清理Windows臃肿系统的终极指南
  • 2026年春招在线笔试系统:如何用三路监考终结AI搜题作弊?
  • 国内GEO优化公司TOP推荐|AI时代,谁能帮你抢占流量话语权? - 品牌测评鉴赏家
  • 如何用Python实现大麦网自动抢票?5步提升成功率90%的完整指南
  • JSRPC实战:前端加密逆向与Burp爆破联动的自动化解决方案
  • HC32F030无叶风扇FOC驱动方案代码深度解析
  • PyQt5应用打包进阶:Nuitka实战中如何优雅处理插件警告与外部数据文件(Windows平台)
  • 3个步骤解决老Mac无法升级新系统的困境:OpenCore Legacy Patcher完整指南
  • 哔咔漫画下载器终极指南:3步打造个人漫画图书馆的完整解决方案
  • 保姆级教程:Mindie服务化推理环境变量配置全解析(含OOM避坑指南)
  • RSA加密算法攻击:从数学原理到CTF实战攻击(CTF实战概念篇)
  • 新手友好!TensorFlow 2.15环境搭建5步法,附问题排查
  • Pretext:值得关注的文本排版引擎乓
  • 告别黑盒:用QEMU+GDB单步调试Linux内核,亲手揪出第一个Bug
  • AI原生软件容灾设计避坑指南(2024最新Gartner认证框架实操版)
  • 低代码遇上Agent:平民开发者的超能力时刻
  • Jimeng AI Studio(Z-Image Edition)提示词工程:创作高质量AI图像的关键
  • rz /sz 命令详解(Linux 本地↔服务器文件传输)