《从 0 到 1 上手:RBAC+SpringSecurity 权限管理教程》

在企业系统的运营与管理中,权限控制是保障系统安全、实现业务有序分工的核心环节。如何高效地管理不同用户对功能资源的访问权限,避免操作繁琐与权限混乱?基于角色的访问控制(RBAC)模型与 SpringSecurity 框架给出了有力的解决方案。本文将深入剖析 RBAC 模型的架构、授权逻辑及数据表设计,并详细解读 SpringSecurity 在认证、鉴权等方面的核心功能,为理解企业级系统的权限管理机制提供全面指引。

本博客在若依框架基础上开展讲解

一、RBAC权限模型

1. 介绍

在企业系统中,通过配置用户的功能权限可以实现让不同的人分管不同业务的需求。

权限:用于管理 不同用户 能够访问 哪些功能资源

基于RBAC模型,RBAC(Role Based Access Control)模型,即基于角色的访问控制,主要是将功能组合成角色,再将角色分配给用户,也就是说角色是功能的合集

比如:

企业A总共有12个功能,功能包括财务管理、人事管理、销售管理等等。如果不引入基于角色的访问控制(RBAC)模型的话

  • 假如只需要创建100个用户,我们就需要每创建一个用户就要分配一次功能,这将至少需要进行100次操作(每个用户只能拥有一个功能的前提下)。
  • 假如用户数量增加到1000甚至10000,并且一个用户可能会拥有多个功能,操作将会变得非常繁琐。如图:

基于RBAC授权模式后,我们可以达成以下2个目标:

  • 解耦用户和功能,降低操作错误率
  • 降低功能权限分配的繁琐程度

2. ER图

在一个核心业务系统中,我们通常通过业务分析,从而抽离出数据库表,表确定之后我们会进一步分析表中应该有的字段。

下面先看一份业务ER图:

上图中清楚的描述用户、部门、角色、资源之间的关系,同时我们进一步推导出以下结果:

  • 部门与用户是1: N关系
  • 用户与角色是N:N关系
  • 部门与角色是N:N关系
  • 角色与资源菜单是N:N关系

3. 授权

若依内置的SpringSecurity框架 就是基于RBAC进行权限控制的,可以在后台管理页面上为用户授权。

  • 下图是给用户赋予角色,并且可以可以赋予多个角色

下图中,可以给角色赋予多个功能权限

下图中,我们可以对菜单和按钮进行权限标识的配置

4. 小结

RBAC权限控制的作用:用于控制 每个用户可以访问哪些功能资源

RBAC权限控制最少有几张表:5张表

  • 用户表
  • 用户-角色关系表
  • 角色表
  • 角色-资源关系表
  • 资源表

我们的项目里权限控制相关的表有哪些:7张表

  • 部门表
  • 部门-角色中间表
  • 用户表
  • 用户-角色中间表
  • 角色表
  • 角色-资源中间表
  • 资源表

二、SpringSecurity

1. 介绍

Spring Security是一个基于Spring框架安全 性解决方案,它为应用程序提供了完整的安全管理 功能,包括认证、鉴权、攻击防范和会话管理等,官网地址:spring.io/projects/sp...

💡若依系统中已经集成了Spring Security安全框架。

2. 核心作用

SpringSecurity主要提供了2大功能:认证鉴权

提供了认证功能:即用户登录功能

  • 校验验证码是否正确
  • 通过spring security框架验证用户是否存在,密码是否正确
  • 查询用户所拥有权限的资源菜单列表
  • 最后把用户信息封装到jwt生成的token中返回

提供了鉴权功能:针对非登录的任意请求,Spring Security提供了校验权限功能

  • 判断url是否需要鉴权

    某些请求要直接放行:比如登录、注册、验证码这些接口 ;还有一些静态资源也需要放行,比如html、js、css等

  • 校验token:判断是否为空,是否过期,是否正常解析

  • 校验当前用户是否有权限访问当前的url,有权限则放行,否则是权限不足

3. 权限控制

3.1 认证

认证是用户登录系统时,通过比较用户提供的凭证(如用户名和密码)与系统中存储的信息是否一致,以验证用户身份真实有效的过程。

当前系统的认证流程:

代码入口:zzyl-admin模块下找到:com.zzyl.web.controller.system.SysLoginController.login()

3.2 鉴权

SpringSecurity底层是利用Filter过滤器实现鉴权拦截的

3.2.1 权限校验流程

一个请求过来之后,需要有诸多的校验来能判断是否能有效访问:

  • 如果本次请求的是一个静态资源,比如是doc.htmllogin,可直接放行,在SecurityConfig可以配置放行

  • 如果本次请求在SecurityConfig没有配置放行,比如是/nursing/elder/save

    需要校验当前请求携带的token是否有效,如果token无效,则是认证失败,需要重新认证(跳转到登录页)

    如果token有效,则判断当前登录人是否拥有该权限(认证成功后,可以获取用户的权限列表)

    • 如果有权限,则放行
    • 如果没权限,则提醒权限不足

核心代码位置:在zzyl-framework模块中找到类:com.zzyl.framework.config.SecurityConfig

3.2.2 控制方法权限

具体的url检验是通过Spring Security的提供的权限注解@PreAuthorize实现的,可以判断具体的url是否可以访问

@PreAuthorize 是 Spring Security 框架中提供的一个安全注解,用于实现基于注解的访问控制。

  • 用法:我们可以在方法级别上添加此注解,用以声明特定的安全约束,以确保只有满足指定条件的用户才能调用该方法
  • 原理:当 @PreAuthorize 注解被应用于某个方法时,Spring Security 在该方法执行前会先对当前认证的用户进行权限检查。

    如果检查通过,则允许调用此方法;

    否则,框架会抛出相应的权限异常(如 AccessDeniedException),阻止方法执行。

@PreAuthorize示例:添加了权限控制的代码,在若依框架生成的Controller中都可以见到,如下:

less 复制代码
      @PreAuthorize("@ss.hasPermi('system:user:list')")
      @GetMapping("/list")
      public TableDataInfo list(SysUser user) {
      ​
      }
  • @PreAuthorize :Spring Security框架的权限注解,在执行方法前执行

    • 已经开启注解生效,在SecurityConfig类中添加了如下注解:
    • @EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
  • @ss.hasPermi('system:user:list')

    • 其中的ss是一个被spring管理的bean

      位置:zzyl-framework模块中的com.zzyl.framework.web.service.PermissionService

    • hasPermiPermissionService类中的一个方法,判断是否拥有该权限

    • system:user:list 为方法的参数

综上所述,RBAC 权限模型通过角色与功能的关联,有效简化了用户权限分配的复杂度,而 SpringSecurity 则以强大的认证与鉴权能力,为系统构建了坚实的安全防线。从数据表的设计到实际的权限校验流程,二者的协同作用确保了企业系统在灵活分工的同时,实现了对资源访问的精准管控。无论是用户角色的分配、功能权限的配置,还是接口访问的安全校验,这些机制共同构成了企业级应用不可或缺的权限管理体系,为系统的稳定运行与安全保障提供了关键支撑。

相关推荐
高松燈1 分钟前
kafka入门和核心概念介绍
后端
喵手4 分钟前
Java中Stream与集合框架的差异:如何通过Stream提升效率!
java·后端·java ee
JavaArchJourney5 分钟前
PriorityQueue 源码分析
java·源码
喵手15 分钟前
你知道,如何使用Java的多线程机制优化高并发应用吗?
java·后端·java ee
青梅主码26 分钟前
坐标差 1 公分,返工一整天?试试这个转换窍门
后端
cxyxiaokui00126 分钟前
别让你的Java对象在内存里躺平!序列化带它看世界
后端·面试
中科数测30 分钟前
开源软件惊现高危漏洞,中科固源解决方案利用GDB 调试成关键 “排雷兵”,实战运用指南
安全
渣哥30 分钟前
10年Java老司机告诉你:为什么永远不要相信浮点数相等
java
白露与泡影36 分钟前
SpringBoot前后端token自动续期方案
spring boot·后端·状态模式
青梅主码44 分钟前
重磅!《人工智能和大型语言模型的研究前景:应用、挑战和未来方向》:代理型 AI 和大语言模型是否可以整合?
后端