CanCan嵌套资源控制器授权

3
在我的应用程序中,用户可以将另一个用户指定为他们的“账户经理”,而账户经理则可以修改所有用户信息。我定义了以下能力:
```html

在我的应用程序中,用户可以将另一个用户指定为他们的“账户经理”,而账户经理则可以修改所有用户信息。我定义了以下能力:

```
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异常,因为对于发布内容的检查没有将用户对象传递给ability(尝试在ability中检查用户对象显示为nil)。
有什么想法可以实现这个吗?
tl;dr:使用CanCan来授权访问资源。用户可以将另一个用户指定为帐户管理员。用户具有嵌套资源。问题:帐户管理员无法访问嵌套资源。
1个回答

1
我通过以下方式解决了这个问题:
1)用只加载资源的方式 load_resource :publication 替换了 load_and_authorize_resource :publication 2)在 load_resource 调用后添加了一个 before_filter :authorize,并实现了以下内容:
def authorize
    raise CanCan::AccessDenied unless can? :manage, @publication, @user
end

这个方法可以工作,但我希望有一种更符合 devise 方式的解决方案,如果有的话。欢迎提出想法和反馈。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接