ruby-on-rails - 使用 CanCan 指定拒绝访问的原因

标签 ruby-on-rails cancan

我真的很喜欢 Rails 授权 gem CanCan .但是,我发现自己在某些权限上有多个条件,我希望能够根据用户被拒绝访问的原因向用户提供不同的错误消息。

CanCan 有这种行为的机制吗?我找不到它。我是否必须自己 fork 并添加该行为?

最佳答案

我不认为您可以直接使用 CanCan 来做到这一点。它只是提供了一种方式来说明用户是否可以做某事。

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

如果您创建了一组 Ability 子类来反射(reflect)您要检查的不同类型的访问权限,那么您可以依次询问每个子类用户是否可以做某事。第一个拒绝许可的将用于生成您的特定错误消息。

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

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

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

关于ruby-on-rails - 使用 CanCan 指定拒绝访问的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3867553/

相关文章:

ruby-on-rails - 一起使用设计/Cancan/Rolify

ruby-on-rails-3 - Rails 3 CanCan 授权范围所有权

ruby-on-rails - CanCan之间的区别:read and [:index, :show]?

ruby-on-rails - Ruby on Rails : CanCan and static pages

ruby-on-rails - 我应该使用 `respond_to` 还是在 Rails 中有一个专用的 API 命名空间?

ruby-on-rails - 下载使用 Paperclip 附加的图像

ruby-on-rails - ActiveRecord 何时会保存关联?

ruby-on-rails - Grape::API – 无法自动加载常量 Base,需要/app/api/v1/base.rb 来定义它(LoadError)

ruby-on-rails - Rails 3.2 ActionView::Template::Error javascript_include_tag

ruby-on-rails - cancan + rspec = 未初始化常量 Anonymou(无 s)?