权限设计在各个项目中都有着重要的作用,今天从简到难例举权限的设计过程。
青铜版 登录权限
最基础的登录权限设计,起码能够想到用户表,只要登录的用户名和密码正确且用户未被禁用,则登入系统,由此设计出用户表结构如下
表名: t_user,字段如下
id bigint
user_name varchar
password varchar
status int
create_time timestamp
前端请求流程如下:
1 前端发起post请求
2 输入用户名密码
3 校验用户名密码,如果正确则登入系统
后端请求流程如下:
1 后端得到前端发起的请求参数
2 如果前端请求的参数和数据库的数据一致则登入系统
3 如果前端请求的参数和数据库的数据不一致则拒绝登录
白银版 菜单权限
登录搞定,登录进去看白板界面发呆吗,这时候我们需要有个左边栏菜单,那么左边菜单的权限该如何设计呢
由此设计出菜单表和菜单关联表结构如下
菜单表:t_menu
id bigint
name varchar
status int
create_time timestamp
菜单关联表字段:t_user_menu_relation
user_id bigint
menu_id bigint
status int
create_time timestamp
菜单权限查询SQL伪代码:
select
a.menu_id,c.name menu_name
from
t_user_menu_relation a,t_user b , t_menu c
where
a.user_id = b.id and a.menu_id=c.id
and
a.user_id = #{logonUserId}
仅仅这样其实是不够的,这仅仅是不显示,还要控制直接浏览器拍url跳不过去
黄金版 用户组权限
1 做好了登录
2 做好了左边菜单
我们到了给用户分配权限的界面,点着点着,我用户这么多,一个个分配手还不废了啊,这时候我们想,有没有个一了百了的办法,这时候就到了用户组配置和权限设计阶段
表设计如下:
用户组表: t_user_group
id bigint
name varchar
create_time timestamp
用户组关联表:t_user_group_relation
user_id bigint,
group_id bigint,
status int
create_time timestamp
组权限关联表字段:t_group_menu_relation
group_id bigint
menu_id bigint
status int
这样分配的时候先配组,再下挂用户即可,这时候要先判断用户组是哪个,是否有显示菜单的权限
铂金版 按钮权限
分配到用户组了,看了看还挺满意,随便点击到一个页面,问题又来了,我每个页面都有按钮,我不想让普通用户有导出功能(VIP特供),我要控制它们显示和不显示(不可用),好吧,继续无脑一回
button按钮表字段
id,name,status,create_time
menu_button_relation菜单页面按钮关联表字段
menu_id,button_id,status,create_time
回到权限分配页面
之前是用户组分配菜单权限,现在菜单分配按钮权限也要有
是不是权限分配要变成两个页面?
星耀版 唯我独尊
我这么多的表,一次登录要把这么多的关联查询拿出来,我烦,我效率低下,我不开心,用什么结构能一次保存这么多个层级结构,像棵树一样,又不是二叉树只有两个点...
XML? JSON ? JSON?!!
哈哈,JSON 怼缓存,走mongo,美滋滋