我们需要一种方法让权限控制守卫知道要验证的权限到底是什么,可以使用 Nest 框架提供的 SetMetaData 装饰器,在方法上使用这个装饰器设置一些数据,在守卫那里可以得到这些数据 ..
定义
不过一般不直接使用这个 SetMetaData 装饰器,可以去创建一个自定义的装饰器让它返回特定的 meta 数据,在 core,decorators 里面,新建一个装饰器,名字是 permissions.decorator.ts,在这个文件里定义一个装饰器,export const Permissions,它是一个方法。
方法接收一组 permissions 参数,再设置一下参数的类型,可以去创建一个 Interface。
在 core,interfaces 里面,新建一个 permission.interface.ts。
在这个文件里导出一个接口,export interface,名字是 PermissionInterface,暂时只添加一个 role,类型是 UserRole 。
回到这个 Permission 装饰器的定义,permissions 的值的类型是一组 Partial 的 PermissionInterface。
这个方法用一下 SetMetadata,设置的 meta 数据的名字叫 permissions,对应的值就是 permissions 参数的值,也就是使用这个装饰器的时候提供的一组 permission 数据。
使用
找个地方可以使用一下这个装饰器,打开 user.controller ,这个控制器,找到它的 update 方法,在这个方法的上面,用一下 @Permissions 装饰器。
使用它的时候可以提供一组权限,一个对象,里面添加一个 role 属性,值设置成 UserRole.ADMIN 。