数据库 权限设计 角色 用户组

来源:互联网 发布:网络教育报名流程 编辑:程序博客网 时间:2024/05/19 23:17

整理自一位资深学长凋落的讲课

基本上在任何的 后台管理系统中都有权限管理,而我们javaee,主要就是开发后台管理系统的,所以权限是逃不掉的。 通过不断的优化改进 这个权限系统 可以适应越来越大的项目

一、用户

权限系统的核心是用户,指登录到系统的用户。

用户表 是权限系统唯一一个与业务系统关联的表

大学做项目的时候,我们的权限就是一个用户表就搞定了。里面有一个状态:是不是管理员。

管理员就有所有的目录,如果不是得话,就会少一点。

很明显,这样做,是十分智障的
因为这样权限多了。就完全没有办法管理

所以我们要增加一个权限表

权限表示 用户具有的权限比如某个目录用户与权限是多对多关系,所以就变成了上边这样一个用户可以具有多个权限 一个权限可以被多个用户拥有

二、角色

这样设计有个问题

权限多了怎么办,一个一个的去找权限赋予 新来的人,是一件很麻烦的事情

这里就需要添加全新的 概念 :角色

角色表示 一个用户的角色 一个用户可以具有一个或者多个角色,普通员工 产品经理 这些 都是角色的概念

将这些角色赋予新来的用户,可以减少一个个操作权限进行操作的麻烦


图中箭头始终由从表指向主表


随着业务的增加 后台管理系统的目录 也变得很多 很复杂

而且 权限应该 不仅能管理 你是否能看这个页面

也应该你是否能看到这个按钮

比如A只能 进行新增 B只能进行修改


于是新增 目录表资源按钮表


目录表 //来存储左侧的  目录结构资源按钮表 //来存储  该权限可以调用哪个按钮为了实现不同的人 进了相同的页面  看到的按钮不一样,我们需要加入  按钮资源表

刚才的设计
有个问题

如果功能是相互依赖的怎么办?

比如说,我先点 新增 然后点保存 结果发现 我 tmd没有保存按钮的权限

加表

权限与按钮形成多对多关系

保证一个权限 有1-多个按钮

有完成这个功能 必要的 所有按钮权限

同时一个按钮 可以被多个按钮使用比如保存按钮

我新增的时候要用保存按钮

修改的时候也要用保存按钮

所以是多对多关系

目录 权限 也是相同的道理



用户组

现在又有了新的需求

公司很大

一下子新进来100个人,如果一个个的分配角色 好烦啊

这个时候就要增加 全新的概念

一个用户可以在多个用户组里,一个用户组可以有很多用户 同时为一个组的用户 赋予权限 赋予角色 可以减少操作

随着业务的增加,每增加一个全新的权限
当权限比较通用时,管理员 要为每一个角色 赋予新的权限

也比较烦

这时要增加一个新的概念 角色组

角色组包含一组角色  你可以为一组角色赋予权限。。

但是新增了角色组 也要和用户 用户组 进行关联 这就很致命了 要增加很多表

增加了 角色组 概念后 的


然而这个看似 很酷炫的 权限系统 无法实现数据级权限

所谓数据级权限 就是我和你做同样的操作 来进行查询 ,但是查询 到的 结果不一样

如何实现不同的人进行相同的查询结果不一样呢?

所谓的 数据级权限的设计 并不是为 某人 赋予 可以查什么的权利

这样想比较难,我们反其道而行之

目录和按钮权限 是赋予用户 他具有这个权限

而数据级权限 越赋予用户权限 他能查到的东西越少

数据库表 表 存储了 这个数据库中的所有表 表名

数据权限 表 存储了 某个表下的约定


比如 sex=1 权限 (位于员工表下)

当这个权限被赋予我时,我每次查员工表 时 程序 就会自动在sql后边拼上 where sex =1

导致我无法偷看 女员工信息

每 赋予 我 一个数据级权限 我能查到的数据越少

如果一个人能看全部数据 那么他应该一个数据级权限都没有

当数据级权限增多的时候,程序就会 自动在你的sql后边拼 and xx=yy and xxx=yyy and xxxx=yyyy

在程序上 所有的查询都应该传入 两个参数 原始sql和userid

你的底层应该 根据userid 查到 这个人应该增加 什么样的数据级权限

这是4个 8表关联的查询的合集

每条线表示一个多表关联查询 用union all 关联起来 就是这个人的所有数据级权限

4个 8表关联查询

然后用循环 拼到 sql 后边 返回

再交给 hibernate 这样的持久化底层去做

但是,。。,并不是每个表都需要数据级权限 而且 没有多少数据

用户表 能超过10w条 ?

好 我们假设 是 京东

京东 有 7万人 算上快递员 这系统也能用

join这么多表 其实 一般情况下 返回也就几条数据 大部分都是 空结果集

再多一张表 叫 员工

员工与 用户 其实是个一对一关系 不出意外的情况下

为什么多一个员工表

这样就可以实现 业务系统与权限系统 接触耦合

所有业务 (员工干了什么事) 不再与 用户相关联

权限系统 可以独立提升出来放到 更快更屌的数据库里

业务系统 不需要关心 权限系统 是如何设计实现的

实际上 如果这系统要是只有两个人用 完全砍掉80% 的表

那么 这么屌的 ER图 我们怎么吹比?

1 菜单查询出来,可维护菜单,系统新增/减少功能 无需修改权限代码2 可单独控制每一个按钮权限,甚至可以实现 按钮可以看见但是不能点3 数据级权限精确控制,不同的人查询到的数据不一样4 可承载高用户数后台,用户组存在使得即使为1w个用户赋予权限也非常轻松5 可承载高权限数据后台,即使你的后台功能一次更新就新增2000个按钮,只要我把它们放到一个或几个权限里 就可以了6 可承载高角色数据后台,角色组的存在 使得无论你有多少种项目经理,我一个角色组搞定7 与业务系统解耦合,权限系统复杂程度自由定制,后期方便扩展
0 0
原创粉丝点击