上传了文件以后要保存文件数据,保存文件数据的时候要记录一下文件相关的内容的 id,在保存之前我们需要检查一下这个内容的作者是不是上传文件的用户,如果不是,就不允许保存文件数据。
打开 policy.interface ,修改一下这个权限策略类型,里面添加一个新的属性,名字是 subjectIdQuery? 类型是 string,它的值是来自查询符里的检查主题的 id。因为创建文件接口需要通过一个 post 查询符来设置文件相关的内容。
打开 PolicyGuard,这个权限策略守卫也需要再修改一下,这里我们先从请求里解构一下 query,它的值就是地址查询符。然后在这个 checkPolicy 方法里面,从 policy 里面解构出 subjectIdQuery。
下面判断了 useInstance,这个 subjectId 的值,可以先判断一下 subjectIdParam 有没有值,如果有,这个 subjectId 的值就是 params 里的 subjectIdParam ,如果不是,这个 subjectId 的值就是 query 里的 subjectIdQuery。也就是这个 subjectId 的值,要么来自地址参数,要么来自地址查询符。
在 file/modules/create 下面新建一个文件,放在 policies 里面,名字是 create-file.policy.ts ,文件里默认导出一个数组,类型是 Array
打开 FileCreateController,在 createFile 接口上面,使用一个 @UsePolicies ,把 createFilePolicy 里的东西放进来,在使用的守卫这里,再添加一个 PolicyGuard。
测试
在 Http 客户端,可以测试一下,发送一下这个创建文件请求,得到了一个正常响应,说明当前这个用户可以管理 id 号是 1 的这个内容。
下面可以使用小雪的身份,再随便新创建一个内容,先复制一下小雪的令牌,然后复制一份创建内容请求,名字是创建内容(小雪),改一下请求的身份验证,用小雪的令牌替换一下这个 Token 字段的值。
然后发送一下这个请求,这样这个内容的作者就是小雪,新创建的这个内容的 id 是 5。
回到创建文件请求,修改一下 post 查询符的值,改成刚才新创建的内容的 id,发送一下这个请求,得到的是一个状态码是 403 的响应,意思是用户没有权限。
因为当前发布创建文件请求的这个用户,不能管理 id 号是 5 的这个内容。