使用CanCan在一些更高级的授权上苦苦挣扎

时间:2014-11-21 14:32:22

标签: ruby-on-rails ruby devise cancan rails-admin

这里全新的Ruby和Rails,我刚刚开始我的第一个项目。先了解Lynda的新教程,然后开始了一个新的项目,到目前为止我使用的是RailsAdmin,CanCan和Devise。

尝试使用CanCan进行更高级的授权,我正在努力解决如何做到这一点。对于我正在做的普通用户:

can :access, :rails_admin
can :dashboard
can :read, [Company, ProductCategory]
can [:read, :update], User, :id => user.id
can :manage, [Product, Catalog], :company_id => user.company.id
can :manage, [Image, Video, Document, Link]
cannot :export, :all

哪种方法效果很好,但我在图像,视频,文档和链接方面有点挣扎。这些都属于产品或目录,并且按照我上面的方式进行操作,使用户可以访问任何文件。理想情况下,我想要的是:

can :manage, [Image, Video, Document, Link], :product.company_id => user.company.id

但显然我不能这样做,因为没有:产品,而只是文件所属产品的:product_id。那么我如何访问文件中的:product_id所引用的产品的公司ID?

除此之外,公司可以是另一家公司的子公司(可以是另一家公司的子公司等)。那我该怎么办呢:

can :manage [Product, Catalog], [:company_id, :company.company.id, :company.company.company.id (etc)] => user.company.id

用户基本上应该能够管理属于他们公司的产品和目录,或属于他们公司的任何子公司的产品和目录。


为了清晰和简化,

已编辑

Company1有子公司Company2,Company2有子公司Company3,Company3有子公司Company4。

用户属于Company2(非Company1)。

用户应该管理从Company2开始的所有公司,这意味着它应该能够管理Company2,Company3和Company4,而不是Company1。

所以我尝试添加:

can :manage, Company, :company_id => user.company.id
can :manage, Company, :company => { :company_id => user.company.id }
can :manage, Company, :company => { :company => { :company_id => user.company.id } } 

所以这里的第2行似乎有效,我可以看到Company2和Company3。但是,应该由第三行处理的Company4似乎没有在列表中显示,也不能由该用户管理。

那么......为什么这条线不起作用?我怎样才能将这一切全部放在一条线上并处理无限级别的公司,而不是为我添加的每个新级别添加一行?

1 个答案:

答案 0 :(得分:1)

第一部分:

假设:

  • 用户属于公司
  • 产品属于公司
  • 图片属于产品
  • 文档属于目录

这些所有权限都是can方法的第三个参数,例如:

can :manage, Image, :product => { :company => user.company_id  }

如果公司有很多目录:

can :manage, Document, :catalog => { :company => user.company_id  }

或者如果产品有许多目录:

can :manage, Document, :catalog => { :product => { :company => user.company_id  } }

第二部分:

假设:

  • 公司模式company_id符合要求“公司有很多公司有很多公司等”

这样,如果第一部分(用户可以管理公司):

can :manage, [Product, Catalog], :company_id => user.company_id

就是这样。在这里,公司树的嵌套方式并不重要,重要的部分是用户始终属于公司,如果是公司或公司的子公司,则无关紧要。