基于角色的访问控制(RBAC)模型实现报告
- 引言
在我原本开发的基于 Java 的外卖管理系统中,员工之间并没有精细化的权限控制,不同岗位的员工共享了相同的后台操作权限。为了解决这一问题,并实现系统管理员、店铺管理员与普通员工之间的差异化访问控制,我基于课程中学习的 RBAC(基于角色的访问控制)模型,对系统权限模块进行了设计与实现,从而显著提升了系统的安全性和可维护性。
- RBAC 模型简介
RBAC(Role-Based Access Control,基于角色的访问控制)是一种广泛应用于安全系统中的权限管理模型。该模型不再直接将权限分配给用户,而是通过角色这一中间层,将权限赋予角色,再将角色赋予用户,从而实现更具扩展性、可维护性与安全性的权限管理方式。
RBAC 的核心逻辑如下图所示:

图 1RBAC 权限控制关系示意图
在此模型中,用户通过所分配的角色来获取访问权限,而角色封装了一组特定的权限。
RBAC 模型包含以下基本元素:
- 用户(User):系统的使用者;
- 角色(Role):代表某一职责或岗位;
- 权限(Permission):对某项资源操作的授权。
该结构简化了权限管理流程,有助于权限审计与策略执行。
- 角色与权限需求分析
|
角色名 |
描述 |
所需权限 |
|
店主(Owner) |
拥有全部权限的系统管理员 |
employee:view, employee:add, dish:add, dish:update, dish:delete, order:list, order:detail, statistics:view, category:, setmeal: |
|
店铺管理员(Manager) |
协助管理店铺运营 |
dish:add, dish:update, order:list, statistics:view, category:view, setmeal:view |
|
员工(Staff) |
处理日常订单与只读权限 |
order:list, dish:view, category:view, setmeal:view |
- 数据库设计
为实现不同角色的权限映射,并避免硬编码,我设计了如下数据库结构支持多对多关系:

图 2数据库表结构设计示意图
用户登录后,系统通过 employee_role 表查询用户所拥有的所有角色,再通过 role_permission 表获取其对应的权限,并将其缓存至 JWT 或 ThreadLocal,供后续权限校验使用。该结构支持灵活扩展与权限解耦,增强了系统的适应性。
- 初始化数据
为实现 RBAC 模型,部署时系统初始化了以下数据:
角色表
|
Role Name |
Description |
|
Admin |
拥有全部权限的管理员 |
|
Manager |
店铺管理员 |
|
Staff |
普通员工 |
权限表
包括但不限于以下权限:
|
Permission Code |
|
|
|
employee:view |
查看员工信息 |
|
|
employee:add |
添加员工 |
|
|
employee:update |
|
|
|
… |
… |
角色与权限映射
|
Role |
Assigned Permissions |
|
Admin |
全部权限 |
|
Manager |
除员工管理外所有权限 |
|
Staff |
查看订单、菜品、分类、套餐权限 |
员工与角色绑定
|
Employee Username |
Assigned Role |
|
admin |
Admin |
|
manager001 |
Manager |
|
staff001 |
Staff |
- Java 实现部分
为实现基于角色的权限控制,系统后端引入以下关键组件:
EmployeeController
负责登录处理,并从业务层获取权限信息写入 JWT。

图 3 控制器中嵌入权限信息的流程
EmployeeService
根据员工 ID 查询其角色,并进一步获取权限列表。









