用户登录

下面我们可以定义一个测试用户权限用的接口,在项目里新建一个文件,放在 app/modules/access-control/dtos 里面,名字是 check-user-access.dto.ts ,文件里定义并导出一个类,类的名字是 CheckUserAccessDto,用它描述一下使用这个测试用户权限接口的时候要提供的主体数据。

在类里面添加一个 resourceType,类型是 string,用 @IsString() 装饰一下,再用一个 @IsNotEmpty 装饰一下。 然后添加一个 resourceId,类型是 number,用 @IsNumber 装饰一下,再用一个 @IsNotEmpty,然后添加一个 resourceUserId,表示资源作者的 id,类型是 number,用 @IsNumber 装饰一下,再用一个 @IsNotEmpty 。

然后添加一个 resourceStatus? 表示资源的 status 字段的值。类型是 any ,用 @IsOptional 装饰一下。 最后再添加一个 action,类型是 Action,用一个 @IsEnum,提供一个 Action。

测试用户权限接口

打开 AppAccessControlController 控制器,在控制器里添加一个 constructor ,然后注入一个依赖,需要一个 AppAbilityFactory ,名字是 appAbilityFactory 。

下面定义一个接口,用 @Post 装饰一下,地址是 check-user-access,再用一个守卫,@UseGuards,添加一个 AuthJwtGuard 。处理器的名字是 checkUserAccess ,方法添加一个 user 参数,用 @CurrentUser 装饰一下,名字是 user,类型是 UserEntity,下面再用 @Body 装饰一个 body 参数,类型是 CheckUserAccessDto。

在方法里面声明一个 userAbility ,等于 this.appAbilityFactory.createAbilityForUser ,提供一个 user 。这样在后面我们就可以使用这个 userAbility 上的 can 或者 cannot ,检查这个用户对指定的主题是否可以执行指定的动作。

下面用 let 声明一个 resource ,类型是 any, 下面可以用一个 switch 检查一下 body.resourceType,如果资源类型是 PostEntity,设置一下 resource ,新建一个 PostEntity 。

然后设置一下 resource.id 等于 body.resourceId,再设置一下 resource.status 等于 body.resourceStatus ,再设置一下 resource.userId,等于 body.resourceUserId。

最后接口 return 的东西是一个对象,里面添加一个 name,用字符模板组织一个字符串,先是 user.name,然后是括号,里面添加一个 id,加上一个 user.id 。 在这个对象里再添加一个 result,它的值可以用一下 userAbility.can ,动作是 body.action,主题是 resource。

定义测试用户权限接口《 Nest.js 企业级后端实践:权限控制 》

统计

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

社会化网络

关于

微信订阅号

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