使用 defineAbility 或者 AbilityBuilder 定义权限,完成以后,一般这些权限就不再改动了,如果你想让应用的管理员可以通过用户界面调整用户权限,我们把需要权限信息存储在数据仓库里,然后在应用里获取到用户的权限规则数据,再把它交给 Ability。
casl.ability.ts
打开 casl.ability.ts,用 JSON 对象数据定义权限,只需要 @casl/ability 里的 Ability,去掉 AbilityBuilder。
再修改一下这个模块里默认导出的函数,去掉里面所有的东西。 先声明一个 rules,它是一个数组,假设这个 rules 数据是请求接口或者查询数据库得到的一组数据。
让这个方法 return 一个 Ability,把 rules 交给它。
然后先手工设置一下这个 rules 数据,每个规则是一个对象,在对象里面,可以用 action 设置一下动作,比如 read。再添加一个 subject,值是 Post。这个规则的意思就是用户可以读取所有 Post 类型的内容。
再添加一条规则,action 是 update,subject 是 Post,再添加一个 fields,把允许更新的字段设置成 title ,然后再添加一个 conditions,设置一下条件,它是一个对象,把 userId 设置成 user.id。
下面判断一下,如果 user.isVerfied ,执行 rules.push 添加一条规则 ,规则的 action 是 update,subject 是 Post, fields 是 status,再添加一个 conditions,一个对象,userId 等于 user.id 。
测试
在 http 客户端测试一下,发送一下这个请求,得到的响应跟之前是一样的。