权限管理设计
问题描述
当前设计为每个用户定义独立的Sidebar文件,如:
- 张三登录使用
SideBar1.vue
- 李四登录使用
SideBar2.vue
- …
SideBarN.vue
这种设计方式繁琐且臃肿,不易维护和扩展。
解决方案:RBAC(基于角色的访问控制)
采用RBAC思想进行权限管理设计。核心思想是用户 -> 角色 -> 权限。建议从后往前进行数据库表设计。
从后往前数据库表设计步骤
第一步:权限表设计
参考zTree设计权限:zTree v3文档的设计思想,权限表的设计如下:
CREATE TABLE menu (
menu_id VARCHAR2(32) PRIMARY KEY,
menu_name VARCHAR2(30),
menu_url VARCHAR2(30),
icon VARCHAR2(20),
is_parent VARCHAR2(2),
parent_menu_id VARCHAR2(32),
CONSTRAINT menu_fk FOREIGN KEY(parent_menu_id) REFERENCES menu(menu_id)
);
menu_id
: 权限菜单的唯一标识menu_name
: 权限菜单的名称menu_url
: 权限菜单对应的URLicon
: 权限菜单的图标is_parent
: 是否是父菜单(用于zTree结构)parent_menu_id
: 父菜单的ID,用于构建菜单的层级关系
第二步:角色表设计
角色用于分配和管理用户权限,每个角色可以有不同的权限。角色表结构如下:
CREATE TABLE roles (
role_id VARCHAR2(32) PRIMARY KEY,
role_name VARCHAR2(20)
);
role_id
: 角色的唯一标识role_name
: 角色的名称
第三步:角色—权限关联表设计
角色和权限之间是多对多的关系,这需要使用第三张表来表示。该表的主键是前面两张表的主键的组合。
-- 创建角色---权限关联(roles_menu)表
CREATE TABLE roles_menu (
role_id VARCHAR2 (32),
menu_id VARCHAR2 (32)
);
-- 添加主键
ALTER TABLE roles_menu ADD CONSTRAINT roles_menu_pk PRIMARY KEY (role_id, menu_id);
-- 添加外键
ALTER TABLE roles_menu ADD CONSTRAINT roles_menu_roles_fk FOREIGN KEY (role_id) REFERENCES roles (role_id);
ALTER TABLE roles_menu ADD CONSTRAINT roles_menu_menu_fk FOREIGN KEY (menu_id) REFERENCES menu (menu_id);
role_id
: 角色的唯一标识menu_id
: 权限的唯一标识
第四步:用户表设计
用户表用于定义系统中的所有用户。
CREATE TABLE users (
user_id VARCHAR2(32) PRIMARY KEY,
user_name VARCHAR2(30),
password VARCHAR2(30)
);
user_id
: 用户的唯一标识user_name
: 用户的名称password
: 用户的密码
第五步:用户—角色关联表设计
用户和角色之间是多对多的关系,这需要使用第三张表来表示。该表的主键是前面两张表的主键的组合。
-- 创建用户---角色关联(users_roles)表
CREATE TABLE users_roles (
user_id VARCHAR2(32),
role_id VARCHAR2(32)
);
-- 添加主键
ALTER TABLE users_roles ADD CONSTRAINT users_roles_pk PRIMARY KEY (user_id, role_id);
-- 添加外键
ALTER TABLE users_roles ADD CONSTRAINT users_roles_users_fk FOREIGN KEY (user_id) REFERENCES users (user_id);
ALTER TABLE users_roles ADD CONSTRAINT users_roles_roles_fk FOREIGN KEY (role_id) REFERENCES roles (role_id);
user_id
: 用户的唯一标识role_id
: 角色的唯一标识
最终实现
通过角色来管理用户的权限,实现动态Sidebar的加载。具体步骤如下:
- 用户登录后,系统根据用户ID获取其对应的角色。
- 根据角色获取其对应的权限菜单。
- 动态生成用户的Sidebar。
通过这种设计,可以实现基于角色的访问控制,动态地为用户分配不同的权限,简化系统的维护和扩展。