RBAC 权限设计

Lewis
2022-06-17 / 0 评论 / 176 阅读 / 正在检测是否收录...

权限设计

image-20220614101713485

客户端想访问资源接口时,都需要经过鉴权,才能正常访问,没有经过鉴权的请求, 都会被拒绝。采用 SpringSecurity OAuth2.0,对客户端进行授权及鉴权,步骤如下:

  1. 客户端携带账号、密码,请求授权服务,授权服务验证账号、密码是否正确, 如果正确返回 token 令牌,否则告知客户端账号或密码不正确等。
  2. 客户端携带 token 令牌请求资源接口,网关会请求鉴权服务,判断用户是否有权 限访问该资源,如果有权限,则返回资源的响应数据,否则告知客户端无权访问该资源。

菜单权限

系统分为超级管理员普通管理员,超级管理员拥有所有功能权限及数据权限,主要职责是创建普通管理员账号,并给普通管理员分配权限。在系统里,拥有用户管理、 角色管理的账号,我们就可以理解成普通管理员,因为可以新建用户及分配权限。管理员新建用户、角色、部门时,会有一定的约束,保证不会有越权操作。

系统权限

数据权限

数据权限分为全部数据权限、本部门及子部门数据权限、本部门数据权限、本人数据权限四种,根据登录的用户角色判断其权限范围,进行数据的过滤,没相应的数据权限,则不能查询、操作相应的数据。

数据权限实现方式如下:

  1. 用户登录后,获取其所属角色中权限最高的级别及所属部门。
  2. 根据部门 ID 列表进行数据过滤,数据过滤表,都需要有部门 ID

image-20220614102635020

数据库设计

关系图

image-20220614111411746

表清单

序号数据表名称
1sys_dept部门表
2sys_menu菜单权限表
3sys_role角色信息表
4sys_role_dept角色和部门关联表
5sys_role_menu角色和菜单关联表
6sys_user用户信息表
7sys_user_role用户和角色关联表

表字段明细

1.1.1 sys_dept [组织架构表]

#字段名称数据类型主键非空默认值备注说明
1dept_id部门idBIGINT(20)
2parent_id父部门idBIGINT(20) 0
3ancestors祖级列表VARCHAR(50)
4dept_name部门名称VARCHAR(30)
5order_num显示顺序INT(11) 0
6status部门状态CHAR(1) '0'0正常 1停用
7del_flag删除标志CHAR(1) '0'0代表存在 2代表删除
8create_by创建者VARCHAR(64)
9create_time创建时间DATETIME
10update_by更新者VARCHAR(64)
11update_time更新时间DATETIME

1.1.2 sys_menu [菜单权限表]

#字段名称数据类型主键非空默认值备注说明
1menu_id菜单IDBIGINT(20)
2menu_name菜单名称VARCHAR(50)
3parent_id父菜单IDBIGINT(20) 0
4order_num显示顺序INT(11) 0
5path路由地址VARCHAR(200)
6component组件路径VARCHAR(255)
7menu_type菜单类型CHAR(1) M目录 C菜单 F按钮
8visible菜单状态CHAR(1) '0'0显示 1隐藏
9status菜单状态CHAR(1) '0'0正常 1停用
10perms权限标识VARCHAR(100)
11icon菜单图标VARCHAR(100) '#'
12create_by创建者VARCHAR(64)
13create_time创建时间DATETIME
14update_by更新者VARCHAR(64)
15update_time更新时间DATETIME
16remark备注VARCHAR(500)

1.1.3 sys_role [角色信息表]

#字段名称数据类型主键非空默认值备注说明
1role_id角色IDBIGINT(20)
2role_name角色名称VARCHAR(30)
3role_key角色权限字符串VARCHAR(100)
4role_sort显示顺序INT(11)
5data_scope数据范围CHAR(1) '1'1:全部数据权限
2:本部门及以下数据权限
3:本部门数据权限
4:本人权限
6status角色状态CHAR(1) 0正常 1停用
7del_flag删除标志CHAR(1) '0'0代表存在 2代表删除
8create_by创建者VARCHAR(64)
9create_time创建时间DATETIME
10update_by更新者VARCHAR(64)
11update_time更新时间DATETIME
12remark备注VARCHAR(500)

1.1.4 sys_role_dept [角色和部门关联表]

#字段名称数据类型主键非空默认值备注说明
1role_id角色IDBIGINT(20)
2dept_id部门IDBIGINT(20)

1.1.5 sys_role_menu [角色和菜单关联表]

#字段名称数据类型主键非空默认值备注说明
1role_id角色IDBIGINT(20)
2menu_id菜单IDBIGINT(20)

1.1.6 sys_user [用户信息表]

#字段名称数据类型主键非空默认值备注说明
1user_id用户IDBIGINT(20)
2dept_id部门IDBIGINT(20)
3user_name用户账号VARCHAR(30)
4nick_name用户昵称VARCHAR(30)
5user_type用户类型VARCHAR(2) '00'00 系统用户
01 B端用户
02 C端用户
6email用户邮箱VARCHAR(50)
7phone_number手机号码VARCHAR(11)
8sex用户性别CHAR(1) '0'0男 1女 2未知
9avatar头像地址VARCHAR(100)
10password密码VARCHAR(100)
11status帐号状态CHAR(1) '0'0正常 1停用
12del_flag删除标志CHAR(1) '0'0代表存在 2代表删除
13login_ip最后登录IPVARCHAR(128)
14login_date最后登录时间DATETIME
15create_by创建者VARCHAR(64)
16create_time创建时间DATETIME
17update_by更新者VARCHAR(64)
18update_time更新时间DATETIME
19remark备注VARCHAR(500)

1.1.7 sys_user_role [用户和角色关联表]

#字段名称数据类型主键非空默认值备注说明
1user_id用户IDBIGINT(20)
2role_id角色IDBIGINT(20)

建表SQL

DROP TABLE IF EXISTS sys_dept;
CREATE TABLE sys_dept(
    dept_id BIGINT(20) NOT NULL AUTO_INCREMENT  COMMENT '部门id' ,
    parent_id BIGINT(20)   DEFAULT 0 COMMENT '父部门id' ,
    ancestors VARCHAR(50)    COMMENT '祖级列表' ,
    dept_name VARCHAR(30)    COMMENT '部门名称' ,
    order_num INT(11)   DEFAULT 0 COMMENT '显示顺序' ,
    status CHAR(1)   DEFAULT '0' COMMENT '部门状态;0正常 1停用' ,
    del_flag CHAR(1)   DEFAULT '0' COMMENT '删除标志;0代表存在 2代表删除' ,
    create_by VARCHAR(64)    COMMENT '创建者' ,
    create_time DATETIME    COMMENT '创建时间' ,
    update_by VARCHAR(64)    COMMENT '更新者' ,
    update_time DATETIME    COMMENT '更新时间' ,
    PRIMARY KEY (dept_id)
)  COMMENT = '组织架构表';

DROP TABLE IF EXISTS sys_menu;
CREATE TABLE sys_menu(
    menu_id BIGINT(20) NOT NULL AUTO_INCREMENT  COMMENT '菜单ID' ,
    menu_name VARCHAR(50) NOT NULL   COMMENT '菜单名称' ,
    parent_id BIGINT(20)   DEFAULT 0 COMMENT '父菜单ID' ,
    order_num INT(11)   DEFAULT 0 COMMENT '显示顺序' ,
    path VARCHAR(200)    COMMENT '路由地址' ,
    component VARCHAR(255)    COMMENT '组件路径' ,
    menu_type CHAR(1)    COMMENT '菜单类型;M目录 C菜单 F按钮' ,
    visible CHAR(1)   DEFAULT '0' COMMENT '菜单状态;0显示 1隐藏' ,
    status CHAR(1)   DEFAULT '0' COMMENT '菜单状态;0正常 1停用' ,
    perms VARCHAR(100)    COMMENT '权限标识' ,
    icon VARCHAR(100)   DEFAULT '#' COMMENT '菜单图标' ,
    create_by VARCHAR(64)    COMMENT '创建者' ,
    create_time DATETIME    COMMENT '创建时间' ,
    update_by VARCHAR(64)    COMMENT '更新者' ,
    update_time DATETIME    COMMENT '更新时间' ,
    remark VARCHAR(500)    COMMENT '备注' ,
    PRIMARY KEY (menu_id)
)  COMMENT = '菜单权限表';

DROP TABLE IF EXISTS sys_role;
CREATE TABLE sys_role(
    role_id BIGINT(20) NOT NULL AUTO_INCREMENT  COMMENT '角色ID' ,
    role_name VARCHAR(30) NOT NULL   COMMENT '角色名称' ,
    role_key VARCHAR(100) NOT NULL   COMMENT '角色权限字符串' ,
    role_sort INT(11) NOT NULL   COMMENT '显示顺序' ,
    data_scope CHAR(1)   DEFAULT '1' COMMENT '数据范围;1:全部数据权限 2:本部门及以下数据权限 3:本部门数据权限 4:本人权限' ,
    status CHAR(1) NOT NULL   COMMENT '角色状态;0正常 1停用' ,
    del_flag CHAR(1)   DEFAULT '0' COMMENT '删除标志;0代表存在 2代表删除' ,
    create_by VARCHAR(64)    COMMENT '创建者' ,
    create_time DATETIME    COMMENT '创建时间' ,
    update_by VARCHAR(64)    COMMENT '更新者' ,
    update_time DATETIME    COMMENT '更新时间' ,
    remark VARCHAR(500)    COMMENT '备注' ,
    PRIMARY KEY (role_id)
)  COMMENT = '角色信息表';

DROP TABLE IF EXISTS sys_role_dept;
CREATE TABLE sys_role_dept(
    role_id BIGINT(20) NOT NULL   COMMENT '角色ID' ,
    dept_id BIGINT(20) NOT NULL   COMMENT '部门ID' ,
    PRIMARY KEY (role_id,dept_id)
)  COMMENT = '角色和部门关联表';

DROP TABLE IF EXISTS sys_role_menu;
CREATE TABLE sys_role_menu(
    role_id BIGINT(20) NOT NULL   COMMENT '角色ID' ,
    menu_id BIGINT(20) NOT NULL   COMMENT '菜单ID' ,
    PRIMARY KEY (role_id,menu_id)
)  COMMENT = '角色和菜单关联表';

DROP TABLE IF EXISTS sys_user;
CREATE TABLE sys_user(
    user_id BIGINT(20) NOT NULL AUTO_INCREMENT  COMMENT '用户ID' ,
    dept_id BIGINT(20)    COMMENT '部门ID' ,
    user_name VARCHAR(30) NOT NULL   COMMENT '用户账号' ,
    nick_name VARCHAR(30) NOT NULL   COMMENT '用户昵称' ,
    user_type VARCHAR(2)   DEFAULT '00' COMMENT '用户类型;00系统用户 01:B端用户 02:C端用户' ,
    email VARCHAR(50)    COMMENT '用户邮箱' ,
    phone_number VARCHAR(11)    COMMENT '手机号码' ,
    sex CHAR(1)   DEFAULT '0' COMMENT '用户性别;0男 1女 2未知' ,
    avatar VARCHAR(100)    COMMENT '头像地址' ,
    password VARCHAR(100)    COMMENT '密码' ,
    status CHAR(1)   DEFAULT '0' COMMENT '帐号状态;0正常 1停用' ,
    del_flag CHAR(1)   DEFAULT '0' COMMENT '删除标志;0代表存在 2代表删除' ,
    login_ip VARCHAR(128)    COMMENT '最后登录IP' ,
    login_date DATETIME    COMMENT '最后登录时间' ,
    create_by VARCHAR(64)    COMMENT '创建者' ,
    create_time DATETIME    COMMENT '创建时间' ,
    update_by VARCHAR(64)    COMMENT '更新者' ,
    update_time DATETIME    COMMENT '更新时间' ,
    remark VARCHAR(500)    COMMENT '备注' ,
    PRIMARY KEY (user_id)
)  COMMENT = '用户信息表';

DROP TABLE IF EXISTS sys_user_role;
CREATE TABLE sys_user_role(
    user_id BIGINT(20) NOT NULL   COMMENT '用户ID' ,
    role_id BIGINT(20) NOT NULL   COMMENT '角色ID' ,
    PRIMARY KEY (user_id,role_id)
)  COMMENT = '用户和角色关联表';

0

评论 (0)

取消