在企业系统的运营与管理中,权限控制是保障系统安全、实现业务有序分工的核心环节。如何高效地管理不同用户对功能资源的访问权限,避免操作繁琐与权限混乱?基于角色的访问控制(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.html
或login
,可直接放行,在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
-
hasPermi
是PermissionService
类中的一个方法,判断是否拥有该权限 -
system:user:list
为方法的参数
-
综上所述,RBAC 权限模型通过角色与功能的关联,有效简化了用户权限分配的复杂度,而 SpringSecurity 则以强大的认证与鉴权能力,为系统构建了坚实的安全防线。从数据表的设计到实际的权限校验流程,二者的协同作用确保了企业系统在灵活分工的同时,实现了对资源访问的精准管控。无论是用户角色的分配、功能权限的配置,还是接口访问的安全校验,这些机制共同构成了企业级应用不可或缺的权限管理体系,为系统的稳定运行与安全保障提供了关键支撑。