# 4、关于用户角色权限
# 介绍
目前框架内置了sys过滤器(云函数层的权限过滤器,检测用户是否有此业务云函数的执行权限)
用户表:`uni-id-users`
角色表:`uni-id-roles`
权限表:`uni-id-permissions`
由于云数据库的特殊性
用户角色中间表为用户表中的`role`字段(用户角色列表,由`role_id`组成的数组)
角色权限中间表为角色表中的`permission`字段(角色拥有的权限列表,由`permission_id`组成的数组)
1
2
3
4
5
6
2
3
4
5
6
# 云函数权限检测逻辑
这里只是介绍下,框架已内置,无需写对应的代码
1. 用户访问云函数 `user/sys/updateUserInfo`
则 `url = "user/sys/updateUserInfo"`
则云函数权限检测就变成了用户是否有执行 `user/sys/updateUserInfo` 云函数的权限。
2. 根据 `token` 获取到用户 `permission`
3. 根据权限表的权限规则(如完整匹配、通配符匹配、正则匹配)校验用户拥有的 `permission` 是否有任意一个权限匹配到了此 `url`
4. 若能匹配,代表用户有此云函数执行权限,放行,若不能匹配,代表用户无此云函数执行权限,需要拦截。
1
2
3
4
5
6
2
3
4
5
6
以上为用户角色权限校验的大致逻辑(因为非常灵活配置,可以适用于所有系统:admin后台,ERP软件,APP、小程序等)
但是:如果你只想要在小程序客户端(非admin端)增加一个权限控制,且角色不多,如只有3个角色(商家,用户,骑手),且权限规则基本固定,则我们可以使用更简便高效的方法。
- 商家特殊权限:查看自己店铺订单,发货等
- 骑手特殊权限:接单,查看自己接到的订单等
- 用户特殊权限:无
1. 编写自定义过滤器 在目录 `middleware/modules/` 新建2个过滤器
分别为:`shopFilter`、`riderFilter`
2. 在 `shopFilter` 的 `regExp`属性写 `^client/shop/manage/(.*)` 代表所有`client/shop/manage/`开头的云函数都会先执行`shopFilter`过滤器
3. 在 `shopFilter` 的 `main` 属性写自己的检测逻辑,如判断 `userInfo.role` 包含 `shopManage` 这个角色即放行,否则拦截
4. 把商家才能进行的特殊权限的云函数写在 `client/shop/manage/` 目录下即可
1
2
3
4
5
2
3
4
5
# shopFilter 示例代码
/**
* 店铺权限过滤器
*/
module.exports = [
{
id: "shopManage",
regExp: "^client/shop/manage/(.*)",
description: "店铺操作接口需要检测用户是否有权限",
index: 210,// 此处必须>200 因为检测用户是否登录的过滤器的index是200
mode:"onActionExecuting", // 可选 onActionExecuting onActionExecuted
enable:true, // 通过设置enable=false可以关闭该中间件
main: async function(event) {
let { util, filterResponse } = event;
let { vk , db, _ } = util;
let { userInfo = {} } = filterResponse;
let { role = [] } = userInfo;
let res = { code : 0, msg : 'ok' };
if(role.indexOf("shopManage") === -1){
return { code : -1, msg : '无权限' };
}
return res;
}
}
]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
riderFilter
同理