用户登录

定义用户权限的时候可以设置一个条件对象,让它作为 can 还有 cannot 方法的第三个参数。比如我们的应用要允许用户访问所有的 Post,也就是文章内容,用户可以更新自己发布的内容。下面我们可以使用 CSAL 把应用需要的这个权限表达出来。

casl.ability.ts

先打开 casl.ability.ts,这次我们可以导出一个函数,函数支持一个 user 参数,类型先设置成 any, 函数返回的值就是执行 defineAbility 得到的结果。这样在这个 defineAbility 里面我们可以使用函数里的 user 这个参数的值。

先定义一下用户可以阅读所有内容这条权限,用一下 can,动作的名字可以是 read,主题设置成 Post,这条权限的意思就是可以读取所有 Post 这种类型的内容。

再定义一下用户可以更新自己发布的 Post 这条权限,用一下 can,动作的名字是 update, 主题是 Post,再提供一个对象参数,里面设置一个条件,条件是 userId 应该是 user 参数值里的 id 属性的值。

也就是 Post 这种类型的内容里面,应该有个 userId 属性,如果这个属性的值跟 user 里的 id 这个属性的值一样,说明这个内容是这个用户自己发布的,这样就可以 update 这个 Post。

检查权限

打开 app.controller,在这个文件里,导入 casl.ability 默认导出的东西,起个名字叫 defineAbilityFor 。

然后在 home 这个处理器方法里面,先声明一个 user, 它是一个对象,添加一个 id 属性,值是 1 。 再声明一个 ability,执行一下 defineAbilityFor ,把 user 交给这个函数。这样这个 ability 就是 id 是 1 的这个用户的权限。

下面声明了一个 post,它的值是一个 Post 实例。

可以再声明一个 ownPost,表示用户自己发布的内容,新建一个 Post 实例,然后设置一下 ownPost.userId 让它等于 user.id 。

然后我们再检查一下用户权限,这里已经声明了一个 canReadPost,用一下 ability.can,动作是 read,主题是上面定义的这个 post。

再声明一个 canUpdatePost,用一下 ability.can,检查 update 动作,主题是 post。 下面再声明一个 canUpdateOwnPost,用一下 ability.can 检查的动作是 update,主题是 ownPost。

在响应的数据里面,添加一个 canUpdatePost,再添加一个 canUpdateOwnPost。

测试

在 http 客户端,发送一下这个请求,你会发现 canReadPost 会是 true,因为用户可以读取所有 Post 类型的内容。下面这个 canUpdatePost 是 false,因为用户不能随便更新 Post 类型的内容。

canUpdateOwnPost 是 true,因为用户可以更新自己发布的内容。

假设现在我们想让用户只能读取状态是已发布的内容。回到项目,先打开 casl.ability.ts,修改一下这个 can read Post 权限,在里面添加一个条件,放在一个对象里面,添加一个 status,值是 published。这样这条权限的意思就是只能读取 status 是 published 这种状态的内容。

打开 post.model,在这个类里面添加一个新的属性,名字是 status,类型是 string。

然后可以在 http 客户端,再发送一下这个请求。这次这个 canReadPost 它的值会是 false, 这是因为现在用户不能随便读取任何状态的内容了,只能读取状态是 published 的内容。

在 post.controller 里面,设置一下这个 post 的 status ,让它等于 published。

再到 http 客户端,发送一下这个请求,这次这个 canReadPost 就会是 true 了,因为检查权限的那个主题的 status 它的值是 published。

定义权限时设置条件《 CASL:权限控制 》

统计

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

社会化网络

关于

微信订阅号

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