我真的很喜欢Rails授权gem CanCan。但是,我发现自己在某些特权上有多种条件,并且我希望能够向用户提供不同的错误消息,具体取决于他或她被拒绝访问的原因。
CanCan可以有一种针对这种行为的机制吗?我找不到它。我是否必须分叉并自己添加该行为?
最佳答案
我认为您不能直接使用CanCan做到这一点。它仅确实提供了一种说出用户是否可以做某事的方式。
我想知道您是否可以通过定义多个Ability
子类来检查权限,从而以非典型方式使用它。默认实现是为当前用户创建Ability
实例并对其进行查询。
如果创建了Ability
子类的集合以反映您要检查的不同类型的访问,则可以依次询问每个用户用户是否可以执行某项操作。然后,第一个拒绝许可将用于生成您的特定错误消息。
您只需要真正地创建一个总体能力类来组合Ability
子类的集合,并在CanCan提供的current_ability
方法中创建该能力类即可为当前用户返回该能力。然后,通过在类上提供相同的can?
和cannot?
方法,它将以与普通功能相同的方式工作,但是您可以对其进行扩展以提供可以识别哪个why?
方法的Ability
方法。 >子类拒绝权限,并因此生成另一条错误消息。
实际上,您还必须提供authorize!
的新实现,以使其返回所需的错误消息。
抱歉,答案很长,基本上是-您必须自己做。