用户登录

用户可以通过用户角色拥有一些权限 .. 之前我们定义过一个叫 Can 的 Trait . 先找到这个 Trait .. 它里面的这个 getPermissions 方法可以返回用户的权限列表 ..

现在它返回的就是直接给用户分配的权限 ... 在这个权限列表里我们可以再把用户拥有的角色相关的权限也放进来 .. 先添加一个 _roles .. await 用一下 this.roles() .. 得到用户的所有角色 .. 再用一个 with ,载入角色相关的 permissions ... 最后用一个 fetch() ..

下面再添加一个 _rolePermissions ... 它的值用一下 _roles.toJSON() .. 再用 map 迭代一下 .. 当前项目叫 role ,要返回的是 role 里的 permissions .. 就是角色拥有的权限列表 ..

因为用户可能拥有多个用户角色,所以这个 _rolePermissions 的值应该是个数组,因为每个用户角色都会拥有一组权限,所以它里面每个项目又会是一个数组,每个数组里面是一组权限列表 ..

下面再添加一个 rolePermissions .. 先用 flatten 处理一下 _rolePermissions .. 它会去掉数组里的层级 .. 得到一个统一的数组... 里面的项目就是不同的角色拥有的权限 .. 接着用 map 迭代一下 .. 当前项目叫 permission ... 返回 permission 里的 name ...

这样这个 rolePermissions 里的东西就会是一个用户角色拥有的权限列表,每个项目的值就是权限的名字 ..

用户拥有的权限,包含单独给用户分配的权限列表 ... 再加上用户角色拥有的权限,在 permissions 里面,把 rolePermissions 里的东西也放进来 ... 在这个权限列表里面,很可能会有重复的项目 .. 去掉数组里的重复的项目,可以用 uniq 来处理一下 ..

这里用的 flatten 还有 uniq 都是 lodash 这个库里提供的方法 ..

在文件顶部 .. 从 lodash 里面,把 flatten ... 还有 uniq 这两个方法拿出来用一下 ...

试验

然后先回到数据库客户端 ... 找到应用数据库 ... 先打开 user_permission 这个数据表 .. 把单独给用户分配的权限去掉 ..

回到项目 ... 打开 routes.js ... 在 demo/acl 这个路由里面再试一下 ... 添加一个 permissions ... 用一下 user 上面的 getPermissions ... 得到用户的权限 ...

再返回得到的这个 permissions ...

回到浏览器 .. 访问一下 demo/acl 页面 ...

提示了一个 canot read propety name of undefined ...

回到项目 .. 这个是因为在这个 map 方法里面,我们要返回的是角色里的 permissions ... 少了一个 s ...

再回到浏览器 .. 访问一下 demo/acl ..

现在给我们返回的就是 id 号是 1 的用户拥有的权限列表 ... 这个权限是通过用户所属的用户角色获得的 ...

再修改一下 ... 看一下 id 号是 2 的用户的权限 ...

显示用户拥有 create post 还有 read post 权限 .. 因为这两个权限我们分配给了 member 这个角色 ...

通过角色拥有权限《 Node.js 应用:权限控制 #2 》

统计

14696
分钟
0
你学会了
0%
完成

社会化网络

关于

微信订阅号

扫描微信二维码关注宁皓网,每天进步一点