现在我们再去实现一个更灵活的检查权限与用户角色的功能 .. 比如可以判断用户要拥有某些角色但不能是另一些角色 .. 或者判断用户拥有某些权限但不能有另一些权限 ..
先去安装一个包 .. 在命令行下面,执行一下 npm install acler --save ... 保存在项目的依赖里面 ..
完成以后,先打开 Can 这个 Trait .. 在文件顶部先从刚才安装的 acler 这个包里面,把 check 这个方法拿出来用一下 ...
在这个 trait 里面,有个 can 方法,找到这个方法 ... 改造一下它 .. 现在它接收一个 permissions 参数,这个参数的名字可以把它换成 permissionExpression .. 表示权限的表达式 .. 再去掉 all 这个参数 ...
在方法里面只留下这个 userPermissions .. 剩下的判断权限的逻辑可以替换成使用 check 方法来实现 ..
添加一个 result ... 它的值是 check 方法返回的东西 .. 这个方法有两个参数 ... 要检查的表达式就是 premissionExpression ... 然后是个回调 .. 接收一个 permission 参数 .. return 的就是 this.userPermissions.includes ... 检查 permission ...
最后再 return 一下这个 result ...
使用这个 check 方法检查权限,我们还得去修改一下权限的名字 ... 先回到数据库客户端 ... 找到应用数据库 .. 打开 permissions 数据表 ..
这里我们之前定义的权限的名字中间有空格 ... 这里可以把这个空格替换成下划线 ... 修改一下所有这些权限的名字 .. 都把空格替换成下划线 ..
然后回到项目 .. . 打开 routes.js ... 找到 demo/acl 这个路由 ..
这里可以再试一下我们改进之后的这个权限检查功能 .. 添加一个 result ... await user.can ... 这个 can 方法现在接收一个权限表达式 ..
这个表达式里面我们可以使用一些操作符 .. 比如像 && 表示并且 ... || 表示或者 ... ! 表示否定 .. 我们还可以使用括号组织这个表达式 ..
update_post && delete_post ... 意思就是必须有 update_post 还有 delete_post 权限 ..
现在这个 user 表示的就是 id 号是 2 的这个用户 ...
return 一下这个结果 ..
回到浏览器 .. 访问一下 demo/acl ... 返回的是 false ,说明 id 号是 2 的这个用户没有同时拥有 update_post 还有 delete_post 权限 ..
再回来改一下 ... 找到 id 号是 1 的这个用户 ..
刷新一下 demo/acl 页面 ... 这回返回的是 true ... 说明这个用户同时拥有 update_post 还有 delete_post 这两个权限 ..