这里全新的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似乎没有在列表中显示,也不能由该用户管理。
那么......为什么这条线不起作用?我怎样才能将这一切全部放在一条线上并处理无限级别的公司,而不是为我添加的每个新级别添加一行?
答案 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
就是这样。在这里,公司树的嵌套方式并不重要,重要的部分是用户始终属于公司,如果是公司或公司的子公司,则无关紧要。