【问题标题】:Inherited Resources and CanCan 3 levels nesting继承资源和 CanCan 3 级嵌套
【发布时间】:2011-03-22 15:59:30
【问题描述】:

CanCan 中模型的 3 层嵌套与继承资源相结合时遇到问题。我读过我们应该将所有内容嵌套到 2 层,但我必须将所有内容放在 account 模型下,现在我尝试在 CanCan 中这样做:

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

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

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

另一个奇怪的事情是当我从 CanCan 的定义中删除 load_and_ 部分时。它可以工作,但我读到不使用load 部分可能很危险。

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

【问题讨论】:

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


【解决方案1】:

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

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'的项目。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多