【问题标题】:Cancan nested resources restricting access to indexCancan 嵌套资源限制对索引的访问
【发布时间】:2012-08-30 21:08:44
【问题描述】:

我目前在我的网络应用程序中使用 cancan,到目前为止它运行良好,但我遇到了关于 rails 中嵌套资源的问题。访问索引页面时,cancan 不会限制用户查看其他登录用户可以看到的内容。它适用于显示页面,但在访问索引页面时它不起作用。

routes.rb

resources :skater do
  resources :videos
end

ability.rb

can :manage, Video, :skater => { :user_id => user.id }

video_controller.rb

load_and_authorize_resource :skater
load_and_authorize_resource :video, :through => :current_user

如何限制对其他用户索引视图的访问,使用户 A 无法观看用户 B 的视频?

【问题讨论】:

  • 您看起来不像是在嵌套资源中。能否请包括您正在使用的其他 load_and_authorize_resource 呼叫。
  • @BaylorRae' 我已经更新了上面但没有效果
  • @BaylorRae' 我添加了 cannot [:read, :show], Video 并且它有效,但是当我尝试查看我自己的视频时它不起作用我收到与受限用户相同的错误。

标签: ruby-on-rails ruby-on-rails-3 cancan


【解决方案1】:

尝试删除 :through => :current_user 以查看是否解决了您的问题。查看 CanCan Wiki 中的 second code example 了解嵌套资源应该如何使用。

CanCan 将通过您应用程序中的current_user 方法获取当前用户。因此,当您是authorizing controller actions 时,您不必定义它。


更新:尝试在您的控制器中使用它。

load_and_authorize_resource :skater
load_and_authorize_resource :video, :through => :skater

更新 2:我不知道 CanCan 失败是因为 Ability Precedence 还是因为当前用户只是未经授权。

根据我目前所见,这是您的ability.rb 文件的外观。第二行将覆盖第一行,允许您限制可以查看和更改的数量。我决定使用:manage,因为它通过包含所有权限“涵盖了所有基础”。

cannot :manage, Video # this will include :read, :show, :edit, :update, and :delete
can :manage, Video, :skater => { :user_id => user.id }

我担心的是您没有正确过滤滑冰者。如果您有任何问题,我建议您尝试一下。

can :manage, Video, :user_id => user.id

【讨论】:

  • 我删除了 current_user 并只添加了 :through => :skater ,但仍然没有。你认为问题出在我的能力.rb 文件吗?
  • @coletrain 我更新了我的答案。看看这是否能让你更接近。
  • 想通了!如果用户和一切都开始工作,我会添加。我已经更新了你上面的答案,谢谢你的帮助。
【解决方案2】:

你应该检查这个问题,和你一样的问题。

Cancan nested_routes restrict acces to :index

【讨论】:

  • 这不是同一个问题。你的问题是因为你没有授权资源。 @coltrain 的问题似乎是因为他使用的是:through => :current_user
猜你喜欢
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多