应用里的一些接口需要设置一下访问权限,只有有权限的用户才能使用这个接口。我们可以定义一个装饰器,通过它来设置接口需要的一些权限,然后再去定义一个守卫,用来检查当前用户是否拥有接口要求的权限。
先定义一个表示权限策略的类型,放在 app/modules/access-control/types 里面,名字是 policy.interface.ts,文件里 export 一个 interface ,名字可以是 Policy,里面添加几个属性,先添加一个 subject,它的类型可以是 typeof UserEntity 或者 typeof PostEntity,也就是这个 subject 可以是 UserEntity 或者 PostEntity 的实例,也可以是这两个类型的其中的一个。
再添加一个 action,表示动作,类型是 Action,然后再添加一个 useInstance?,类型是 boolean,它表示是否要验证主题的实例,如果是的话,在一会定义的权限检查守卫那里,要获取到主题的实例,获取实例一般要去查询数据仓库,我们需要知道一个资源的 id,这个资源 id 可以通过接口处理器的一个地址参数里得到,添加一个 subjectIdParam? 类型是 string 。
生成装饰器
在终端,项目所在目录的下面,执行 nest generate 生成一个 decorator 名字是 use-policies,放在 app/modules/access-control/decorators 里面 ,加上 --flat 选项。这个装饰器的作用就是在处理器或者控制器上面设置需要的权限策略。
UsePolicies
回到项目,打开 UsePolicies 这个装饰器,在上面可以 export 一个 const,名字是 USE_POLICIES,值是一个字符串 use_policies 。这个装饰器的参数,类型是 Array
使用
打开 post-update.controller ,在这个控制器里定义了一个更新内容用的接口,这个接口需要检查用户权限,比如要求用户可以更新内容。
可以先创建一个权限策略文件,放在 post/modules/update/policies 里面,名字是 update-post.policy.ts。文件里可以默认导出一个数组,作为的类型设置成 Array
回到 PostUpdateController,在这个 updatePost 方法的上面,用一个 UsePolicies ,把 updatePostPolicy 里面的东西放进来。这里我们只是通过 UsePolicies 说明了一个接口需要的权限策略。具体检查这些权限策略可以交给一个守卫去完成。