0

亲爱的所有人(尤其是 Ryan,感谢您所做的出色工作),我对一些可能真的很愚蠢的事情完全发疯了,但对于我的一生,我无法用我的大脑来解决它。

我正在尝试使用 Can Can 进行授权,并且我在除此之外的所有内容上都正确设置了它(这是我的问题,在一个特定的事情上,显然工作正常,但我不确定我是否做得对或不是 - 实际上我认为我无法证明它不能正常工作)。

让我们看看我是否能够清楚地解释我在做什么:

我有两个模型(用户和相册),它们通过第三个模型共享连接:

(A) 用户模型

has_many :albums, :dependent => :destroy # ownership
has_many :shares, :foreign_key => "shared_user_id" #, :dependent => :destroy
has_many :shared_albums, :through => :shares

(B) 专辑型号

belongs_to :user
has_many :shares, :foreign_key => "shared_album_id", :dependent => :destroy
has_many :shared_users, :through => :shares

(C) 共享模式

belongs_to :shared_user, :foreign_key => "shared_user_id", :class_name => "User"
belongs_to :shared_album, :foreign_key => "shared_album_id", :class_name => "Album"

现在,在我的能力课程中,我想做的是限制特定用户在 (C) 共享模型上可以执行的操作。

在我的应用程序中,用户可以创建一个相册,然后他可以将其他用户添加到该相册(此用户是唯一可以访问特定相册的用户)。此外,相册中的每个用户也可以添加新用户。

所有这些都是为相册中的用户提供创建共享的能力(共享模型将用户和相册模型相关联)。

现在最大的问题是,我如何限制添加(创建)共享到特定相册的能力,仅限于属于该相册一部分的用户(通过共享)?

例如,如果我有:

users => id (1,2,3,4) [我的应用中总共有 4 个用户)

专辑 => id (45,32) [我的应用中总共有 2 张专辑)

分享 => (album 45 => [user (1,2,3)] ; album 32 => [users(1,4)]) [我的应用中共有 5 个分享]

我怎么能在能力类中说,在专辑 32(例如)上,只有用户 1 和 4 可以添加(创建)新共享(添加新用户),而用户 2 或 3 他们不能?

我已经限制了用户 2 和 3 访问资源专辑 32 的能力(我在专辑类级别上这样做了),但我想确保无论出于何种原因,创建用户的能力也受到限制。

到目前为止,我的能力课程中拥有的是:

def initialize(user)

  (A) ALBUM LEVEL

     # (1) Every User can create Album, without restrictions
     can :create, Album   

     # (2) Only the user that own the Album can manage it
     can :manage, Album, :user_id => user.id 

     # (3) The Album can be read by all the users that are part of that specific album
     can :read, Album, :shares => {:shared_user_id => user.id}

     # (4) The Album can be read by every user if the privacy attribute is false
     can :read, Album, :privacy_setting => false


  (B) SHARE LEVEL

     # (1) Only the user that own the Album can manage all the shares for the album
     can :manage, Share, :shared_album => {:user_id => user.id}

     # (2) The other users (in the album), can just manage themself (their share)
     can :manage, Share, :shared_user_id => user.id

     # (3) The Share in the album can be read by every user if privacy is false (just read)
     can [:read], Share, :shared_album => {:privacy_setting => false}
     cannot [:create,:destroy,:delete], Share, :shared_album => {:privacy_setting => false}


 #### (X) CRUCIAL POINT CREATE NEW SHARE
     can :create, Share, :shared_album => {:shared_users => {:id => user.id}}

 end

(X)CRUCIAL POINT 中的条件是否是正确的条件,只允许已经是相册一部分的用户向相册添加新用户???

这完全让我发疯。

感谢大家,特别是感谢谁能让我对这一切有更多的了解。

最好的迪努斯

4

1 回答 1

0

你的能力.rb 对我来说似乎很好。

您的关键点执行以下操作:

如果该共享存在共享相册,并且当前用户包含在该共享相册的 shared_users 中,则用户可以创建共享。

不过要记住一件事。由于您在授权时检查共享的shared_album,因此您必须在尝试授权之前先设置它。

例如:

@share = @albums.shares.build
authorize :create, @share

上面的示例将设置shared_album_id共享的,以便您可以对其进行授权。

@share = Share.new
authorize :create, @share

这不起作用,因为共享还没有相册。

希望这可以帮助。

于 2013-04-17T15:34:22.037 回答