我真的很喜欢Rails授权gem CanCan。但是,我发现自己在某些特权上有多种条件,并且我希望能够向用户提供不同的错误消息,具体取决于他或她被拒绝访问的原因。

CanCan可以有一种针对这种行为的机制吗?我找不到它。我是否必须分叉并自己添加该行为?

最佳答案

我认为您不能直接使用CanCan做到这一点。它仅确实提供了一种说出用户是否可以做某事的方式。

我想知道您是否可以通过定义多个Ability子类来检查权限,从而以非典型方式使用它。默认实现是为当前用户创建Ability实例并对其进行查询。

如果创建了Ability子类的集合以反映您要检查的不同类型的访问,则可以依次询问每个用户用户是否可以执行某项操作。然后,第一个拒绝许可将用于生成您的特定错误消息。

您只需要真正地创建一个总体能力类来组合Ability子类的集合,并在CanCan提供的current_ability方法中创建该能力类即可为当前用户返回该能力。然后,通过在类上提供相同的can?cannot?方法,它将以与普通功能相同的方式工作,但是您可以对其进行扩展以提供可以识别哪个why?方法的Ability方法。 >子类拒绝权限,并因此生成另一条错误消息。

实际上,您还必须提供authorize!的新实现,以使其返回所需的错误消息。

抱歉,答案很长,基本上是-您必须自己做。

10-05 21:23
查看更多