0

ユーザー認証とアクセス許可にCanCanとDeviseを使用しています。

ユーザーは、異なるアクセス許可を持つ自分のアカウントのキーホルダーを指名できます。キーホルダーには、アクセスできるアカウントの ID と同じ「access_id」という属性があります。私が達成しようとしているのは次のとおりです。

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new # guest user

    if user.admin?
      can :manage, :all
    elsif user.keyholder?
      can :read, Folder do |folder|
        folder.try(:user) == user.access_id
      end 
    else
      can :create, :all
      can :manage, :all do |all|
        all.try(:user) == user
      end
    end



  end
end

ただし、このコードでは、キー所有者はアクセスするように指定されたアカウントにアクセスできません。これを実現するためにコードを修正するにはどうすればよいですか? ありがとう!

4

1 に答える 1

0

あなたが試すことができます

folder.user_id == user.access_id

キーホルダーがログインしていると仮定します。

となることによって

user.keyholder? => true
user => keyholder
user.access_id => id of user who did nominate current_user
folder.user_id => id of folder owner

編集

そのキーホルダーも自分のフォルダにアクセスしたい場合:

( folder.user_id == user.access_id ) || ( folder.user_id == user.id )

しかし、これはより良いです。これを if / else ステートメントから外して、誰でも (キーホルダーまたは通常のユーザー) が自分のフォルダーにアクセスできるようにします。

def initialize(user)
user ||= User.new # guest user

# every one reads his own folder.. or you can copy this to wherever you want
can :read, Folder do |folder|
  folder.user_id == user.id
end 

if user.admin?
  can :manage, :all
elsif user.keyholder?
  can :read, Folder do |folder|
    # but keyholder accesses even more
    folder.user_id == user.access_id
  end 
else
  can :create, :all
  can :manage, :all do |all|
    all.try(:user) == user
  end
end
end

または、keyholder に対して can :read を複数回定義することもできます。お気に入り:

elsif user.keyholder?
  can :read, Folder do |folder|
    folder.user_id == user.access_id
  end 
  can :read, Folder do |folder|
    folder.user_id == user.id
  end 
else 
于 2013-02-28T18:39:43.667 に答える