【发布时间】: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