2013-02-28 20 views
0

我正在使用CanCan &设计用户身份验证&权限。CanCan - 用户帐号的密钥持有者访问

用户可以为他们的账户提名一个持卡人,他们拥有不同的权限。密钥持有者有一个名为“access_id”的属性,它与他们可以访问的帐户的ID相同。我试图给acheive如下:

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 

但有了这个代码,密钥持有者不能访问帐号被提名访问。我如何纠正代码来实现这一目标?谢谢!

+0

'folder.try(:user)'可能在user.access_id是整数时返回一个用户对象。也许你应该解决这个问题? – 2013-02-28 18:28:05

+0

我试着改变行:folder.try(:user.id)== user.access_id,但这仍然说,访问被拒绝 - 我如何正确地措词? – ecs 2013-02-28 18:31:58

回答

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 

编辑

如果y欧也希望这样持有者也可以访问他/她的文件夹:

(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 

此外,或者,您可以定义can:多次读取keyholder。如:

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 
+0

这就是我所追求的,但不幸的是他们不工作。它是将access_id作为属性的密钥持有者。如果access_id与他们尝试访问的用户的ID相匹配,我希望他们只能访问该帐户。但我似乎无法得到正确的语法!谢谢你的帮助! – ecs 2013-02-28 18:47:50

+0

keyholder也是一个User对象吧?还是另一个设计课? – 2013-02-28 18:50:29

+0

是的,它是一个将keyholder布尔值字段设置为true的用户。 – ecs 2013-02-28 18:52:08

相关问题