用户登录

打开 AccessGuard , 在守卫上想要得到在类或者类的方法上附加的 meta 数据,可以先注入一个 reflector 依赖,添加一个 constructor 构造方法,添加一个属性,private readonly,名字是 reflector,类型是 Reflector。

找到这个守卫的 canActivate 方法,在它里面先添加一个 permissions ,用一下 this.reflector 上的 get 方法,要获取到的 meta 数据的名字叫 permissions,这个就是使用 Permissions 装饰器在类方法上附加的数据的名字,第二个参数是 context.getHandler,这个方法返回的是处理方法。

如果你想得到的是附加到类上面的 meta 数据 ,这里可以换成 context.getClass。

validatePermissions

验证权限可以交给一个方法,添加一个 results,await,使用 await 需要用 async 标记一下这个方法 , canActivate 方法现在 return 的东西应该是 Promise,boolean 。

在 await 后面,用一下 this.validatePermissions,这个方法接收一个 permissions 参数,就是要验证的权限,还有一个 request.user,表示发出当前请求的用户。

这个方法返回的值是一组 boolean 值,下面让 canActivate 方法 return 的是 results.includes,true,就是去检查验证的结果数组里面有没有 true,只要包含 true 这个 Guard 就会让用户通过。

在上面找个地方再去定义这个验证权限用的方法,添加一个方法,名字叫 validatePermissions,这个方法接收一个 permissions 参数,类型是一组 PermissionInterface,方法还需要一个 user 参数,类型是 User。

在方法里面,添加一个 results ,用一下 permissions,map,async permission , 在这个回调里先从 permission 里,把 role 解构出来。

添加一个 hasRole,类型是 boolean,下面判断一下,如果权限项目里有 role ,设置一下 hasRole,它的值用一下 user.roles.some,提供一个回调,userRole,userRole.name 等于 role,这行代码就是去检查当前发出请求的用户的角色,看看有没有在权限里指定的用户角色,如果有 some 方法就会返回 true。

下面让 map 每次迭代的时候 return 的是 hasRole 的值。

最后让 validatePermissions 返回的是 Promise.all,把 results 交给 Promise.all 。

测试

打开 Http 客户端,发送一下这个更新用户的请求,得到了请求成功的响应,这是因为发出这个请求的用户包含了 admin 用户角色。

再到数据库客户端修改一下这个用户的用户角色,打开 user_roles_role,修改一下这条记录的 userId 的值,换成一个其他用户的 id 。

然后回到 Http 客户端,重新发送一下这个请求。

这次得到的响应是 403 ,因为当前发出这个请求的用户现在已经没有 admin 角色了。

在这个 UserController 的 update 方法里面,用了 @Permissions 装饰器,在这个处理器上附加了一条权限信息,要求用户的角色是 admin 。

附加的这个信息我们在 AccessGuard 里会用到,这里用了 reflector 上的 get 得到了附加的 permissions 。

得到的这个值会交给 validatePermissions 方法处理。

在这个方法里,我们用了一个 some 检查当前请求用户里的用户角色里面有没有权限里指定的用户角色。

在权限控制守卫检查用户角色《 Nest.js 应用框架:权限控制 》

统计

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

社会化网络

关于

微信订阅号

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