从0实现RBAC权限模型

详解 RBAC 基于角色的访问控制(Role-based access control),指的是通过用户的角色(Role)授权其相关权限,这实现了更灵活的访问控制,相比直接授予用户权限,要更加简单、高效、可扩展。
当使用 RBAC 时,通过分析系统用户的实际情况,基于共同的职责和需求,授予他们不同角色。你可以授予给用户一个或多个角色,每个角色具有一个或多个权限,这种 用户-角色、角色-权限 间的关系,让我们可以不用再单独管理单个用户,用户从授予的角色里面继承所需的权限。
以一个简单的场景(Gitlab 的权限系统)为例,用户系统中有 Admin、Maintainer、Operator 三种角色,这三种角色分别具备不同的权限,比如只有 Admin 具备创建代码仓库、删除代码仓库的权限,其他的角色都不具备。
从0实现RBAC权限模型
文章图片

我们授予某个用户「Admin」这个角色,他就具备了「创建代码仓库」和「删除代码仓库」这两个权限。
不直接给用户授权策略,是为了之后的扩展性考虑。比如存在多个用户拥有相同的权限,在分配的时候就要分别为这几个用户指定相同的权限,修改时也要为这几个用户的权限进行一一修改。有了角色后,我们只需要为该角色制定好权限后,给不同的用户分配不同的角色,后续只需要修改角色的权限,就能自动修改角色内所有用户的权限。
比如说,我们准备一个代码审查的角色,只允许查看代码,那么我们只需要添加一个角色“代码审查”,并且赋予其代码查看的权限即可,非常的方便。
要实现 RBAC 模型,一般需要以下实体:
用户 User
基础单位,所有的用户都存储在这里
角色 Role
给相应用户配置对应的角色,和用户是多对多的关系
权限 Permission
权限属于最小的控制判断依据,给对应的角色配置对应的权限,这样拥有此权限的用户就可以访问对应的资源,和角色是多对多的关系
实体关系说明 多对多的关系,需要有一个中间表维护关系, User 和 Role 的中间表 User-Role , Role 和 Permission 需要中间表 Role-Permission
场景举例
下面来分析两个具体的应用场景:
现有一个管理系统,简单的分为管理员和普通用户两种角色,管理员具有一些管理权限,但是没有具体业务的权限
从0实现RBAC权限模型
文章图片

新增角色 这时候需要新增一个角色,主要工作是查看用户的所有反馈,类似于客服的角色,这时候我们只要新增一个角色,并把这个角色配置给某个用户就好了
从0实现RBAC权限模型
文章图片

新增权限 业务需求,可以给某个用户实施冻结帐户操作,这时候直接添加一个权限,并配置到管理员即可
从0实现RBAC权限模型
文章图片

在线体验
使用分支的方式,展示在 vscode 中完成一个 SpringBoot 的 RBAC 鉴权服务的具体过程,可以用来当做一些后台系统的基础模板,可以一步一步的按照顺序结合分支代码进行尝试
在线文档
在线体验

用户 帐户 密码
管理员 admin password
普通用户 normal password
后端源码 关键词:spring-boot jpa gradle
【从0实现RBAC权限模型】前端源码 关键词:vue3 composition vite pinia eslint lint-staged commitlint
具体过程
1-开发环境准备
  1. jdk 说明以及安装
  2. gradle 说明和安装配置
  3. vscode 插件推荐
2-初始化 SpringBoot
  1. 初始化 spring-boot 项目,启动
  2. 在 vscode 打开调试模式,查看调试信息
3-Web
  1. 添加 web 依赖,启动
  2. 添加根路由接口,启动,浏览器访问
4-详解 RBAC
  1. 分析 RBAC 的数据结构
  2. 分析详细的使用方法
5-JPA 和 Mysql
  1. 创建本地数据库
  2. 添加 JPA 和 MySQL 依赖,并且成功启动
  3. 设计具体的 Entity
  4. 启动,查看数据库
6-API 设计
  1. 设计 Restful API 接口
  2. 接口规范相关
7-API 实现
  1. 实现 Controller 层
  2. 添加 API 说明文档
8-Repo 和 Service
  1. JpaRepository
  2. Service
  3. 角色和用户的 Controller
9-Security
  1. 添加 Security,访问接口
  2. 登录,访问接口
  3. 完成登录权限认证
  4. 登录接口
  5. 添加 jjwt 依赖
10-Security 验证和处理
  1. 添加最新的 Security 配置
  2. 登录过程
  3. 认证过程
  4. 接口权限认证过程
  5. 添加测试用户数据
  6. 登录、测试接口权限
11-多对多关系
  1. lazy 查询
  2. 解决循环引用问题
  3. 搭配前端联调
12-部署
  1. 在 heroku 创建应用和数据库
  2. 部署应用
  3. 在 vercel 部署前端
  4. 在线访问

    推荐阅读