CanCan嵌套资源控制器授权

时间:2011-04-03 11:21:37

标签: ruby-on-rails cancan

在我的应用程序中,允许用户将另一个用户指定为其“帐户管理员”,并允许帐户管理员修改所有用户信息。我定义了以下能力:

can :manage, User do |user|
    user == current_user or user.account_manager == current_user
end

用户还有一些嵌套资源(例如:出版物)。我定义了以下能力:

can :manage, Publication do |publication, user|
    publication.user == current_user or user == current_user or user.account_manager == current_user
end

在视图中,我使用以下内容检查:
can? :update, @publication, @user_we_are_accessing
can? :create, Publication.new, @user_we_are_accessing

到目前为止一切正常。我的问题在于控制器。在我的PublicationsController中,我补充说:
load_and_authorize_resource :user
load_and_authorize_resource :publication, :through => :user

但是始终会抛出AccessDenied,因为发布检查没有将用户对象传递给该功能(尝试检查能力显示为nil的用户对象)。

我有什么想法可以实现这个?

tl; dr:使用CanCan授权访问资源。用户可以将另一个用户指定为客户经理。用户拥有嵌套资源。问题:客户经理无法访问嵌套资源。

1 个答案:

答案 0 :(得分:1)

我通过以下方式解决了这个问题:

1)仅加载资源load_and_authorize_resource :publication来替换load_resource :publication 2)在load_resource调用之后添加before_filter :authorize,使用以下实现:

def authorize
    raise CanCan::AccessDenied unless can? :manage, @publication, @user
end

这很有效,但是如果有这样的话,我希望有一种能够以设计方式解决这个问题的方法。感谢您的想法和反馈。