生产权限设计
1、前言
通常我们说权限设计,都会立马想到:用户-角色-权限模型,虽然这个看起来很清晰,但是往往在权限这块没法操作,因为没法细分。 我理解的权限分为菜单权限和数据权限。菜单权限就是上面的模型中的权限,而数据权限其实是直接跟用户绑定的。那么怎么设计一个 用户-角色-权限模型呢?
2、设计
我们需要这几个表,user、role、permission(或者也可以叫 menu,因为实际上这个是菜单权限),然后他们的连接表 user_role,role_permisson。user、role 比较简单,重点说 permission。
permission 分为两种,一种是 menu、button 两种,menu 表示一级菜单,二级菜单等,button 表示按钮。至于接口上的权限怎么弄,就是先抽象化成一个权限,比如商品插入:goods_add,在权限表插入这条数据。那么在代码中可以定义一个注解,注解上标识了 goods_add 权限,如图:

然后在拦截器中判断一下,如果这个接口需要校验,那么查出这个用户所有的权限,再对比下有没有这个接口的权限,没有则拦截;有则放行。
那么数据表是怎样的呢?
主要字段是 id、code、name、parentId 和 type。id 和 parentId 主要组成一棵树,code 标识权限如:goods_add,name 标识相应的按钮名称还是菜单名称,type 表示是 menu 和 button。一个基本的数据是:
Id | Code | Name | parentId | type |
---|---|---|---|---|
1 | Home | 首页 | -1 | menu |
2 | goods | 我的商品 | 1 | menu |
3 | goods_add | 新增商品 | 2 | button |
4 | goods_edit | 修改商品 | 2 | button |
那么这上面的数据,在返回给前端时,就可以组成一个树返回,用户就可以在角色页面编辑这个角色所拥有的菜单权限是哪些。
保存时,传入勾选的哪些权限,permission 与 role 通过 role-permission 连接,只需要传入角色 id 以及对应的权限 id 即可,就知道哪些权限被勾选了。在查询的时候,除了所有的权限树之外,还会把所勾选的权限数据返回,让前端去渲染勾选的树。(这东西后端可以合成一步)
3、结论
我看到一个详细版本的,跟我的思路设计是一样的:http://www.justdojava.com/2020/06/30/springboot-menu-auth/