继承资源和CanCan 3级别嵌套

时间:2011-03-22 15:59:30

标签: ruby-on-rails ruby cancan nested inherited-resources

我在CanCan中使用3个级别的模型嵌套与继承资源相结合存在问题。我已经读过,我们应该将所有内容嵌套到最多2个级别,但是我必须将所有内容放在account模型下,现在我已尝试在CanCan中执行此操作:

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级嵌套?另外,我在模型控制器的IR中执行此操作。

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

另一个奇怪的事情是当我从CanCan的定义中删除部分load_and_时。它起作用了,但我已经读过,不使用load部分会很危险。

我可以只使用authorize_resource还是应该使用CanCan?

1 个答案:

答案 0 :(得分:2)

据我所知,您的授权是正确的。

CanCan gem ryan的开发者发布了这应该如何表现: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:/ accounts / 1 / projects / 2 / models / new的错误行为:

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

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

@project = Project.find(params [:project_id])   [...]

,并且不检查当前帐户是否允许读取链接帐户“1”。 如果项目'2'确实是帐户'1'的项目,它不会检查。