参与者中心方案设计
⼀、背景介绍
1.1 需求来源
1.2 需求描述
- ⽀持多租⼾
- ⽀持客⼾⾃定义⻆⾊、菜单权限
- ⽀持根据不同⻆⾊设置不同数据权限控制
- ⽀持⽩名单⽤⼾,⽩名单⽤⼾可以同时在多家企业中
- ⽀持跨部⻔查看数据,⽀持集团查看⼦公司数据权限
- ⽀持对⽤⼾划分岗位管理
- ⽀持对租⼾账号控制,可以对对应租⼾设置有效期,过期该租⼾下所有账号⾃动失效
- ⽤⼾可以对菜单、⽬录、按钮进⾏权限控制
- ⼀个⽤⼾同时可以赋予多种⻆⾊,并对不同⻆⾊取并集
- ⽀持对临时⽤⼾设置有效时间,过期⾃动失效
- 系统租⼾可以对租⼾账号额度充值,可以对租⼾菜单进⾏开放关闭,⼦租⼾只能操作被授予的菜单
⼆、设计⽬标
- 帮助集团更好的管理旗下所有⼦企业。
- 对⽤⼾权限更好的控制避免出现不同⼈员误操作造成数据混乱。
- 多元化管理⽤⼾,帮助企业降本增效。
- 以中台形式服务所有业务中台。
- 以sdk+apollo命名空间+权限注解 形式引⼊,插拔式⽅便快捷接⼊
三、需求范围
四、设计⽅案
4.1 架构设计
4.1.1 功能脑图
4.2 详细设计
4.2.1 系统用例
4.2.2 业务用例
租户管理
岗位管理
部门管理
菜单管理
角色管理
用户管理
4.2.3 业务序列图
获取菜单序列图
业务方接口调用请求序列图
4.2.4 E-R图
4.2.5 表设计
-- ⽤⼾表
create table t_user
(
id bigint auto_increment comment 'ID' primary key,
user_name varchar(20) not null comment '⽤⼾名',
nick_name varchar(64) comment '⽤⼾昵称',
phone varchar(11) comment '⼿机号',
email varchar(255) comment '邮箱',
password varchar(255) not null comment '密码',
avatar varchar(255) comment '头像',
last_login_time datetime comment '最后登陆时间',
available_time datetime comment '失效时间',
available tinyint(1) default 1 null comment '是否启⽤, 0-否,1-是',
is_box_user tinyint(1) default 0 null comment '是否已成为box服务⽤⼾,1-已成',
is_whitelist tinyint(1) default 0 null comment '是否是⽩名单⽤⼾, 0-否, 1-是',
create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP comment '创建时间',
creator_name varchar(255) comment '创建⼈',
update_time datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP comment '更新时间',
updater_name varchar(255) comment '更新⼈'
) engine=InnoDB DEFAULT charset = utf8 comment '⽤⼾表';
-- 租⼾表
create table t_tenant
(
id bigint auto_increment comment 'ID' primary key,
parent_id bigint comment '⽗租⼾id',
tenant_name varchar(255) not null comment '租⼾名称',
contact_mobile varchar(11) not null comment '联系⼈⼿机号',
contact_person varchar(64) not null comment '联系⼈名称',
email varchar(255) comment '邮箱',
logo varchar(255) comment 'log地址',
account_max_num Integer(20) comment '账号最⼤额度,-1:不限',
available_time datetime comment '失效时间',
account_type tinyint(1) default 1 comment '账号类型,0-系统租⼾,1-普通租⼾',
available tinyint(1) default 1 comment '是否启⽤, 0-否,1-是',
remark varchar(255) comment '备注',
create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP comment '创建时间',
creator_name varchar(255) comment '创建⼈',
update_time datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP comment '更新时间',
updater_name varchar(255) comment '更新⼈'
) engine=InnoDB DEFAULT charset = utf8 comment '租⼾表';
-- ⻆⾊表
create table t_role
(
id bigint auto_increment comment 'ID' primary key,
role_name varchar(255) not null comment '⻆⾊名称',
serial_number int(11) default 0 comment '显⽰顺序',
data_permission tinyint(1) comment '数据权限,0-全部,1-指定部⻔数据,2-本部⻔数据,3-本部⻔及以下数据,4-进本⼈数据',
tenant_id bigint comment '所属租⼾id',
remark varchar(255) comment '备注',
deleted tinyint(1) default 0 comment '是否删除, 0-正常,1-删除',
create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP comment '创建时间',
creator_name varchar(255) comment '创建⼈',
update_time datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP comment '更新时间',
updater_name varchar(255) comment '更新⼈'
) engine=InnoDB DEFAULT charset = utf8 comment '⻆⾊表';
-- ⻆⾊部⻔关联表
create table t_role_dept_relationship
(
id bigint auto_increment comment 'ID' primary key,
tenant_id bigint comment '所属租⼾id',
dept_id bigint not null comment '部⻔id,数据权限为指定部⻔时,所选中的部⻔id',
role_id bigint not null comment '关联⻆⾊id',
deleted tinyint(1) default 0 comment '是否删除, 0-正常,1-删除',
create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP comment '创建时间',
creator_name varchar(255) comment '创建⼈',
update_time datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP comment '更新时间',
updater_name varchar(255) comment '更新⼈'
) engine=InnoDB DEFAULT charset = utf8 comment '⻆⾊菜单关联表';
-- 资源表
create table t_resource
(
id bigint auto_increment comment 'ID' primary key,
tenant_id bigint comment '所属租⼾id',
parent_id bigint comment '⽗菜单id',
name varchar(255) not null comment '资源名称',
menu_type int(11) not null comment '资源类型,1-⽬录,2-菜单,3-按钮',
menu_icon varchar(255) comment '资源名称图标',
serial_number int(11) default 0 comment '显⽰顺序',
remark varchar(255) comment '备注',
deleted tinyint(1) default 0 comment '是否删除, 0-正常,1-删除',
create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP comment '创建时间',
creator_name varchar(255) comment '创建⼈',
update_time datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP comment '更新时间',
updater_name varchar(255) comment '更新⼈'
) engine=InnoDB DEFAULT charset = utf8 comment '资源表';
-- 部⻔表
create table t_dept
(
id bigint auto_increment comment 'ID' primary key,
tenant_id bigint comment '所属租⼾id',
parent_id bigint comment '上级部⻔id',
dept_name varchar(255) not null comment '部⻔名称',
principal_id bigint not null comment '负责⼈id',
principal_name varchar(20) not null comment '负责⼈名称',
principal_mobile varchar(11) comment '负责⼈联系电话',
remark varchar(255) comment '备注',
deleted tinyint(1) default 0 comment '是否删除, 0-正常,1-删除',
create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP comment '创建时间',
creator_name varchar(255) comment '创建⼈',
update_time datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP comment '更新时间',
updater_name varchar(255) comment '更新⼈'
) engine=InnoDB DEFAULT charset = utf8 comment '部⻔表';
-- 岗位表
create table t_position
(
id bigint auto_increment comment 'ID' primary key,
tenant_id bigint comment '所属租⼾id',
position_name varchar(255) not null comment '岗位名称',
remark varchar(255) comment '备注',
deleted tinyint(1) default 0 comment '是否删除, 0-正常,1-删除',
create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP comment '创建时间',
creator_name varchar(255) comment '创建⼈',
update_time datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP comment '更新时间',
updater_name varchar(255) comment '更新⼈'
) engine=InnoDB DEFAULT charset = utf8 comment '部⻔表';
-- 操作⽇志表
create table t_operate_log
(
id bigint auto_increment comment 'ID' primary key,
tenant_id bigint comment '所属租⼾id',
type varchar(255) not null comment '操作类型,update、add、deleted',
remark varchar(255) not null comment '操作描述',
deleted tinyint(1) default 0 comment '是否删除, 0-正常,1-删除',
create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP comment '创建时间',
creator_name varchar(255) comment '创建⼈',
update_time datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP comment '更新时间',
updater_name varchar(255) comment '更新⼈'
) engine=InnoDB DEFAULT charset = utf8 comment '操作⽇志表';
-- ⽤⼾⻆⾊关联表
create table t_user_role_relationship
(
id bigint auto_increment comment 'ID' primary key,
user_id bigint not null comment '关联⽤⼾id',
role_id bigint not null comment '关联⻆⾊id',
tenant_id bigint comment '所属租⼾id',
deleted tinyint(1) default 0 comment '是否删除, 0-正常,1-删除',
create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP comment '创建时间',
creator_name varchar(255) comment '创建⼈',
update_time datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP comment '更新时间',
updater_name varchar(255) comment '更新⼈'
) engine=InnoDB DEFAULT charset = utf8 comment '⽤⼾⻆⾊关联表';
-- ⻆⾊菜单关联表
create table t_role_resource_relationship
(
id bigint auto_increment comment 'ID' primary key,
resource_id bigint not null comment '关联资源菜单id',
role_id bigint not null comment '关联⻆⾊id',
tenant_id bigint comment '所属租⼾id',
deleted tinyint(1) default 0 comment '是否删除, 0-正常,1-删除',
create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP comment '创建时间',
creator_name varchar(255) comment '创建⼈',
update_time datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP comment '更新时间',
updater_name varchar(255) comment '更新⼈'
) engine=InnoDB DEFAULT charset = utf8 comment '⻆⾊菜单关联表';
-- ⽤⼾部⻔关联表
create table t_user_dept_relationship
(
id bigint auto_increment comment 'ID' primary key,
user_id bigint not null comment '关联⽤⼾id',
dept_id bigint not null comment '所属部⻔id',
tenant_id bigint comment '所属租⼾id',
deleted tinyint(1) default 0 comment '是否删除, 0-正常,1-删除',
create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP comment '创建时间',
creator_name varchar(255) comment '创建⼈',
update_time datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP comment '更新时间',
updater_name varchar(255) comment '更新⼈'
) engine=InnoDB DEFAULT charset = utf8 comment '⽤⼾⻆⾊关联表';
-- ⽤⼾岗位关联表
create table t_user_position_relationship
(
id bigint auto_increment comment 'ID' primary key,
user_id bigint not null comment '关联⽤⼾id',
position_id bigint not null comment '关联所属岗位id',
tenant_id bigint comment '所属租⼾id',
deleted tinyint(1) default 0 comment '是否删除, 0-正常,1-删除',
create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP comment '创建时间',
creator_name varchar(255) comment '创建⼈',
update_time datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP comment '更新时间',
updater_name varchar(255) comment '更新⼈'
) engine=InnoDB DEFAULT charset = utf8 comment '⽤⼾⻆⾊关联表';
4.2.6 接口设计
4.2.6.1 租户管理
4.2.6.2 岗位管理
4.2.6.3 部门管理
4.2.6.4 日志管理
4.2.6.5 菜单管理
4.2.6.6 角色管理
4.2.6.7 用户管理
4.3 权限框架
4.3.1 Shiro
Apache Shiro™是⼀个功能强⼤且易于使⽤的Java安全框架,可执⾏⾝份验证、授权、密码学和会话管理。借助Shiro易于理解的API,您可以快速轻松地保护任何应⽤程序-从最⼩的移动应⽤程序到最⼤的Web和企业应⽤程序。
4.3.2 Spring Security
Spring Security是⼀个框架,提供 认证(authentication)、授权(authorization) 和 保护,以抵御常⻅的攻击。它对保护命令式和响应式应⽤程序有⼀流的⽀持,是保护基于Spring的应⽤程序的事实标准。
Spring Security的真正强⼤之处在于可以轻松扩展以满⾜⾃定义要求
Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架,它是用于保护基于Spring的应用程序的事实上的标准。Spring Security提供了全面的安全性功能,包括认证、授权、密码加密、会话管理等。
在Spring应用程序中集成Spring Security可以帮助您实现以下目标:
- 保护应用程序的URL和资源,确保只有经过身份验证和授权的用户才能访问它们。
- 提供多种身份验证机制,如用户名/密码、OAuth2、LDAP等。
- 支持基于角色的访问控制,允许您根据用户的角色和权限来限制对特定资源的访问。
- 提供会话管理功能,包括会话超时、并发会话控制等。
- 集成与其他安全相关的库和框架,如Spring Social、Spring Data等
4.3.3 Sa-Token
Sa-Token 是⼀个轻量级 Java 权限认证框架,主要解决:登录认证、权限认证、单点登录、 OAuth2.0、分布式Session会话、微服务⽹关鉴权 等⼀系列权限相关问题。
Sa-Token 旨在以简单、优雅的⽅式完成系统的权限认证部分
4.3.4 权限框架对⽐
名称 | Shiro | Spring Security | sa-token |
优点 | 1、shiro的代码更易于阅读,且使⽤ 简单 2、shiro可以⽤于⾮web环境,不跟任何框架或容器绑定,独⽴运⾏; | 1、spring全家桶中的⼀员,所以对 spring结合较好,项⽬是spring- boot等搭建的,使⽤起来更加⽅便 2、⽀持oauth授权 | 1、简单、优雅的⽅式 完成系统的权限认证部分 2、⽂档⻬全,接⼊简单 3、⽀持OAuth授权认证 4、分布式会话 5、中⽂⽂档 |
缺点 | 授权第三⽅登录需要⼿动实现 | 复杂度最⾼ | 新⽣代 |
建议 | 建议采⽤ |
五 其他
硬件资源要求: 2核4G
中间件依赖:mysql、Redis、Apollo
并发:⽀持1K+⾼并发请求
响应时间:毫秒级
保障数据正常按照权限隔离
六 Q&A
如果对您有帮助的话,希望能得到您的打赏支持。你的每一份鼓励都是我前行的动力源泉