1778 字
约 5 分钟
19
RBAC 权限设计与微服务鉴权架构

RBAC 权限设计与微服务鉴权架构

在前面的章节中,我们已经了解了 RBAC 权限模型。

但是知道模型只是第一步。

在真实项目中,还需要考虑:

  • 权限数据如何存储?
  • 用户登录后如何获取权限?
  • 微服务环境下在哪里进行鉴权?
  • 如何保证鉴权性能?

本篇将从实际项目角度,设计一套完整的权限架构。


一、为什么需要权限系统?

在简单系统中:

用户登录

    ↓

访问接口

    ↓

返回数据

所有用户权限相同。

但是随着业务发展:

不同用户拥有不同能力。

例如:

小红书系统:

普通用户:

发布笔记
点赞
评论
收藏

管理员:

删除违规内容
封禁用户
管理社区

如果没有权限系统:

只能在代码中判断:

if(userId == 10001){

}

这种方式存在很多问题:

  • 权限写死
  • 无法动态修改
  • 维护困难

所以需要独立的权限管理体系。


二、RBAC 权限模型如何落地?

RBAC 的核心关系:

用户 User

    ↓

角色 Role

    ↓

权限 Permission

用户不直接绑定权限。

而是:

用户拥有角色。

角色拥有权限。

例如:

张三

 ↓

运营管理员

 ↓

文章审核权限
用户管理权限

这样设计有什么好处?

如果新增一个运营人员:

只需要:

用户

绑定

运营管理员角色

即可自动拥有对应权限。


三、权限表如何设计?

一个基础 RBAC 系统通常包含五张表:

用户表

t_user

角色表

t_role

权限表

t_permission

用户角色关系表

t_user_role_rel

角色权限关系表

t_role_permission_rel

整体关系:

             用户

              |

        用户角色关系

              |

             角色

              |

       角色权限关系

              |

             权限


四、权限应该控制什么?

很多人理解权限:

就是控制接口。

实际上企业系统中的权限更加复杂。

1. 接口权限

控制接口访问。

例如:

user:add

user:delete

没有权限:

接口直接拒绝。


2. 菜单权限

控制后台菜单显示。

例如:

管理员:

用户管理
商品管理
订单管理

普通员工:

订单管理

3. 按钮权限

控制页面操作。

例如:

删除按钮:

管理员显示

普通用户隐藏

4. 数据权限

控制数据范围。

例如:

销售人员:

只能查看:

自己的客户

管理员:

查看:

全部客户

五、微服务为什么需要鉴权设计?

单体项目:

用户请求

 ↓

后端服务

 ↓

权限判断

比较简单。

但是微服务:

        网关

          |

 ------------------

 |        |        |

用户服务 商品服务 订单服务

请求会经过多个服务。

问题来了:

权限应该在哪里判断?


六、鉴权方案设计

通常有三种方案。


方案一:每个服务独立鉴权

结构:

请求

 ↓

用户服务鉴权

 ↓

订单服务鉴权

 ↓

商品服务鉴权

优点:

  • 服务独立
  • 灵活性高

缺点:

  • 每个服务重复开发
  • 代码重复
  • 容易出现规则不一致

例如:

订单服务:

需要登录

商品服务:

需要登录+权限

不同服务容易产生差异。


方案二:网关统一鉴权

结构:

客户端

 ↓

网关

 ↓

权限校验

 ↓

业务服务

网关负责:

  • Token验证
  • 登录状态判断
  • 权限判断

优点:

统一管理。

业务服务:

只关注业务。

缺点:

网关压力增加。


方案三:混合鉴权(推荐)

实际企业项目更加常见:

客户端

 ↓

网关

 ↓

基础鉴权

 ↓

业务服务

 ↓

细粒度权限校验

例如:

网关:

检查:

是否登录
Token是否有效

订单服务:

检查:

是否拥有订单操作权限

这样:

性能和安全兼顾。


七、权限数据放哪里?

鉴权过程中,需要查询:

当前用户拥有哪些权限。

常见方案:


方案一:直接查询数据库

流程:

请求

 ↓

查询MySQL

 ↓

获取权限

优点:

数据实时。

缺点:

高并发压力大。


方案二:数据库 + Redis缓存

流程:

请求

 ↓

Redis

 ↓

没有数据

 ↓

MySQL

优点:

性能提升。

缺点:

需要维护缓存一致性。


方案三:权限全部放 Redis

流程:

请求

 ↓

Redis

 ↓

返回权限集合

例如:

Redis:

user:10001:permissions

[
"user:add",
"user:delete",
"article:update"
]

优点:

速度最快。

适合高并发系统。


八、完整鉴权流程设计

一个用户请求:

例如:

删除文章

流程:


第一步:用户登录

认证服务:

生成 Token。

例如:

userId=10001

token=xxxxx


第二步:保存用户权限

查询:

用户

 ↓

角色

 ↓

权限集合

保存:

Redis

user:10001:permission

[
article:delete
]


第三步:请求接口

用户访问:

DELETE /article/100

第四步:网关鉴权

检查:

Token是否有效

第五步:权限校验

判断:

是否拥有:

article:delete

有:

继续执行。

没有:

返回:

403 无权限

九、Sa-Token 在其中的位置

整个架构:

              用户

               |

             登录

               |

          Sa-Token认证

               |

             Token

               |

          Redis保存状态

               |

             网关

               |

          权限校验

               |

            业务服务

Sa-Token 主要负责:

  • 登录认证
  • Token管理
  • 权限验证

RBAC负责:

  • 权限关系设计

Redis负责:

  • 权限数据缓存

三者结合:

形成完整权限体系。


十、总结

一个企业级权限系统,本质上解决三个问题:

1. 谁?

用户身份:

User

2. 能做什么?

角色权限:

Role
Permission

3. 如何快速判断?

鉴权架构:

Gateway

+

Redis

+

权限服务

最终形成:

用户

 ↓

角色

 ↓

权限

 ↓

鉴权

 ↓

业务资源

这就是现代互联网系统中常见的 RBAC + 微服务鉴权架构设计。

后续结合:

  • Sa-Token 整合 Redis
  • 登录注册流程
  • 权限同步机制

即可搭建完整用户认证授权体系。

RBAC 权限设计与微服务鉴权架构
https://clxhxhhr.top/posts/2931/
作者
clxstart
发布于
2026-09-20
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。