用户登录

在项目里再生成一个守卫,执行 nest generate guard ,名字是 policy ,放在 app/modules/access-control/guards 里面,加上 --flat 选项。这个守卫可以检查使用 UsePolicies 装饰器,在处理器或者控制器上面设置的权限策略。

回到项目,打开 PolicyGuard,添加一个构造方法,在构造方法里注入两个依赖,private readonly 名字是 reflector,类型是 Reflector,再添加一个 private readonly appAbilityFactory,类型是 AppAbilityFactory。

把这个 canActivate ,返回的类型设置成 Promise,在方法里面先获取到使用 UsePolicies 装饰器设置的权限策略。声明一个 policies,用一下 this.reflector.get 得到的东西的类型是 Array ,装饰器的 key 是 USE_POLICIES ,第二个参数是 context.getHandler() 。这个 policies 默认值可以是一个空白的数组。

下面再解构一下请求,需要 user 还有 params ,用一下 context.switchToHttp() 再调用 getRequest() 得到请求。

然后创建用户能力,声明 userAbility,用一下 this.appAbilityFactory.createAbilityForUser,提供一个 user。

如果策略里面的 useInstance 是 true,这就需要获取到主题实例,也就是我们需要查询数据库,获取到一个指定的实体,再检查用户对个实体是否拥有指定的权限。

这里我们先声明一个 entityManager ,等于 getManager() ,等会儿查询数据仓库的时候会用到它。

下面声明一个检查权限策略的方法,名字是 checkPolicy,用 async 标记一下,有个 policy 参数,类型是 Policy。方法里面解构一下 policy,需要的是 subject,action,useInstance,还有 subjectIdParam,来自 policy。

判断一下,如果 useInstance,再声明一个 subjectId,值是 params 方括号 subjectIdParam ,重新设置一下 subject ,它应该是一个实体的实例。等于 await ,用一下 entityManager.findOne,提供一个实体类型,这里就是 subject,然后是实体 id,设置成 subjectId。

方法返回的东西,可以用一下 userAbility.can 检查用户权限,动作是 action,主题是 subject 。

下面再去执行权限策略检查,声明一个 results ,等于 await,用一下 Promise.all,提供一组 Promise,用一下 policies.map,给它提供一个 checkPolicy 。因为这里用了 await,所在这个 canActivate 方法要用 async 标记一下。

这个方法最后 return 的东西,可以用一下 results.every,一个函数参数,result ,返回的是 result。这样必须 results 里面的值全部都是 true,才能通过验证。

使用权限策略检查守卫

打开 PostUpdateController,在这个 updatePost 处理器上面,再使用两个守卫,@UseGuards,先用一个 AuthJwtGuard,再用一个 PolicyGuard 。

定义检查权限策略守卫(PolicyGuard)《 Nest.js 企业级后端实践:权限控制 》

统计

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

社会化网络

关于

微信订阅号

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