我在 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 做点什么? 最佳答案
据我所知,您的授权是正确的。
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
将在这样的块中结束(这里:创建 Action 。对于其他 Action 应该最后授权!和@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”的项目。
关于ruby-on-rails - 继承资源和CanCan 3层嵌套,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5394081/