# 4、关于用户角色权限

# 介绍

目前框架内置了sys过滤器(云函数层的权限过滤器,检测用户是否有此业务云函数的执行权限)

用户表:`uni-id-users`
角色表:`uni-id-roles`
权限表:`uni-id-permissions`
由于云数据库的特殊性
用户角色中间表为用户表中的`role`字段(用户角色列表,由`role_id`组成的数组)
角色权限中间表为角色表中的`permission`字段(角色拥有的权限列表,由`permission_id`组成的数组)
1
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

以上为用户角色权限校验的大致逻辑(因为非常灵活配置,可以适用于所有系统: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

# 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

riderFilter 同理