4

我正在将 Devise 和 Cancan 用于 rails 3.2.6 应用程序。在应用程序中,我允许用户创建一个文档,其中包含一些收集在表单中的信息。然后我想允许用户在 localhost:3000/users/1/documents 的文档索引页面上仅列出他们的文档,这是有效的。什么不起作用,是我试图通过将 /users/:id/documents 替换为另一个数字来限制用户查看其他所有人的文档。

我正在使用 cancan 并且都尝试过

可以 :index, Document, :user_id => user.id 可以 :read, Document, :user_id => user.id

然后在 Document 控制器索引方法上

if can? :read, Document
 @documents = @user.documents
else
 redirect_to root_path
end

也尝试过:index......但这不起作用。我也在用load_and_authorize_resource..

对我所缺少的有什么想法吗?

我会说,cancan 正在为我的用户管理和用户控制器工作,以便管理员创建、列出和编辑用户,所以我知道 cancan 正常工作。它还用于更新和删除用户文档。只是索引功能不起作用。

class Ability 

include CanCan::Ability 

  def initialize(user) 

    user ||= User.new # guest user (not logged in) 
    if user.id 
      if user.has_role? :user 
        can :create, Document 
        can :read, Document, :user_id => user.id 
        can :update, Document, :user_id => user.id 
      end 
    end 
  end 
end
4

2 回答 2

2

您必须确保未登录的用户以及user.id与文档user_id(文档所有者)不同的用户无权阅读所有文档。

class Ability
  include CanCan::Ability

  def initialize(account)

    user ||= User.new  #non-logged-in user

    # logged in users
    if user.id and user.has_role?(:user)

      #content owners
      can :manage, Document, :user_id => user.id

      #other logged-in users
      can [:show, :create], Document

    end

  end
end

请注意,如果您说 cancan 已经在工作,那么您没有任何类似的行,can :read, :all或者很可能您在某处给予许可。can :read, Document

于 2012-09-17T17:55:34.897 回答
0

在你的情况下,你应该在你的能力课上写

def initialize(user)
  can :manage, Document do |document|
    document.user == user
  end  
end

这将检查文档是否属于登录用户。如果是 can 将返回 true,否则返回 false。

有关如何使用块处理复杂授权的更多详细信息,

https://github.com/ryanb/cancan/wiki/Defining-Abilities-with-Blocks

于 2012-09-17T18:09:46.343 回答