如何将普通对象传递给CASL的权限(反应)

时间:2019-05-17 23:15:19

标签: reactjs casl

如何将条件传递给与异能对象中的条件匹配的<Can />组件。

向我的应用公开权限的AbilityBuilder

AbilityBuilder.define((can, cannot) => {
  cannot('delete', 'user', { role: 2 }) // <- 2
});

应呈现段落的组件。

<Can I="delete" a="user" of={{ role: 1 }}>
    <p>Should be visible</p> 
</Can>

如何传递对象而不是类的实例?我没有找到有关此的任何信息:(

1 个答案:

答案 0 :(得分:1)

这是有关如何使用CASL的常见误解。 ability.can和React的<Can>都不支持这种行为。

您需要做的是了解主体名称是什么,以及CASL如何根据传入的ability.can对象检测主题名称。文档中对此进行了说明:https://stalniy.github.io/casl/abilities/2017/07/21/check-abilities.html#instance-checks

如果文档中的信息不够,请阅读https://github.com/stalniy/casl/issues/59

还请检查示例应用程序https://github.com/stalniy/casl-react-example(有指向codesanbox的链接,因此您可以快速使用它)。 Todo应用程序使用了需要在应用程序中实现的类似用例。

最后,我创建了一个单独的提升https://github.com/stalniy/casl/issues/192,因此其他人将收到一条错误消息,其中包含有关错误用法的说明,并链接至文档。

基本上,您需要定义自己的subjectName检测功能,并以此方式传递用户:

<Can I="delete" this={{ role: 1, __typename: 'user' }}>
    <p>Should be visible</p> 
</Can>

更新typename应该是对象实例的一部分,以防止发生冲突(例如,当对象看起来相同或相似但类型不同时)。保持对象类型及其实例之间一致性的最简单方法是使用类。但是还有其他方法,例如GraphQL具有__typename字段,该字段告诉客户端从服务器接收到的对象类型

更新2 :默认情况下,Ability禁止执行任何操作,因此您的AbilityBuilder不能仅包含禁止的规则。您至少需要一条允许做某事的规则。