2011-03-22 44 views
3

我有一个CanCan模型的3级嵌套与继承的资源相结合的问题。我读过,我们应该巢一切长达2级水平,但我不得不把一切都在account模型,现在我已经在康康舞试着这样做:继承的资源和CanCan 3级嵌套

load_and_authorize_resource :account 
load_and_authorize_resource :project, :through => :account 
load_and_authorize_resource :model, :through => :project 

这给了我,有一个@account变量@project的值,就像它覆盖那个一样。 @project也是应该和@model。我的这个错误,CanCan的,继承的资源还是CanCan不支持3层嵌套?另外,我在ModelsController的IR中执行此操作。

belongs_to :account, :finder => :find_by_name! do 
    belongs_to :project, :finder => :find_by_name! 
end 

另一个奇怪的事情是,当我从康康舞的定义中删除了部分load_and_。它的工作原理是这样的,但我读过,不使用load部件可能会很危险。

我可以只使用authorize_resource还是应该使用CanCan做些什么?

+2

我不知道CanCan支持多少级别,但是你可以自己加载,然后调用'authorize_resource'方法。 https://github.com/ryanb/cancan/wiki/Authorizing-Controller-Actions – jdl 2011-03-22 18:02:54

+0

您可以使用authorize_resource,只需确保在authorize_resource之前使用before_filter进行加载。 – dombesz 2011-03-23 11:39:49

回答

2

就我所能说的,您的授权是正确的。

的康康舞宝石瑞安张贴了这个应该如何表现的开发商:https://github.com/ryanb/cancan/issues/127#issuecomment-364475

这意味着,你

load_and_authorize_resource :account 
load_and_authorize_resource :project, :through => :account 
load_and_authorize_resource :model, :through => :project 

将在这样的(这里是块结束:创建操作对于其他行动应该是最后一个授权!和@model更改):

@account = Account.find(params[:account_id]) 
authorize! :read, @account 
@project = @account.projects.find(params[:project_id]) 
authorize! :read, @project 
@model = @project.models.build 
authorize! :new, @model 

我希望这个答案可以帮助开发人员寻找嵌套的cancan授权:-)。

来源:https://github.com/ryanb/cancan/issues/127#issuecomment-364475


PS:错误的行为/账户/ 1 /项目/ 2 /模型/新:

load_and_authorize_resource :project 
load_and_authorize_resource :model, :through => :project 

这是怎样的一个安全问题,因为这将做

@project = Project.find(PARAMS [:PROJECT_ID]) [...]

,并且不检查当前账户是否被允许读取链接账户'1'。 而且它不检查项目'2'是否真的是账户'1'的项目。