【问题标题】:CanCanCan gem in Rails app: Preventing guests from accessing a specific model does not workRails 应用程序中的 CanCanCan gem:阻止客人访问特定模型不起作用
【发布时间】:2021-09-21 11:29:12
【问题描述】:

在使用 JSONAPI::Resources 和 CanCanCan 的 Rails 应用程序中,我有一个 Caption 模型 (has_one :video) 和一个 Video 模型 (has_many :captions)。

我想只允许访客访问属于已发布视频的字幕:can :read, Caption, video: { visible: true }

但是,这不起作用。客人可以通过访问/captions 路线访问所有字幕。如果我删除上述行,客人将无法访问任何标题,而是收到 401 Unauthorized。

我们有一些以类似方式定义的能力,我只是不知道在这种情况下有什么问题。这个特定的能力定义似乎没有被忽视,而是被错误地解释了。这种变体还让我们来宾访问所有字幕:

can :read, Caption do | caption |
  false
end

如何调试?

【问题讨论】:

  • 如何区分来宾和经过身份验证的用户?你在某处有can :manage, Caption 吗?
  • 我有一个相当复杂的ability.rb 文件,顶部有一个initialize 函数。这会调用其他函数,例如guest_actions(这是我现在正在处理的)、user_actions 等。目前,我在调用guest_actions 后从这个函数中return。此文件中没有can :manage,也没有其他can :read, Caption。
  • 我意识到我的问题更普遍:用户应该只被允许添加字幕到他们自己的视频中,但can %i[create destroy], Caption, video: { creator: { id: person.id } } 会导致 403,除非我删除条件视频。这发生在带有person 参数的author_actions 方法中。使用 Byebug,我可以验证 person.id == video.creator.id.

标签: ruby-on-rails has-many cancancan has-one


【解决方案1】:

要调试您的问题,您可以查看cancancan gem 文档的此页面: https://github.com/CanCanCommunity/cancancan/blob/develop/docs/debugging.md

您还拥有真正有用的 gem byebug: https://www.rubydoc.info/gems/byebug/11.1.3

【讨论】:

  • 谢谢。我们使用 Byebug,但在我的问题的最后一个代码示例中放置 byebug 在运行测试时没有任何影响。我会看一下文档,我之前没有看到你链接到的页面。
  • 该页面前两个部分的命令为ability.can?(:read, Caption.first) 和ability.can?(:index, Caption) 输出true,当我注释掉有关Caption 的行时,它们输出false。能力定义有效果,但Video上的条件没有效果。
猜你喜欢
  • 2017-11-22
  • 2012-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多