Ruby on rails 正在使用CanCan处理一些更高级的授权

Ruby on rails 正在使用CanCan处理一些更高级的授权,ruby-on-rails,ruby,devise,cancan,rails-admin,Ruby On Rails,Ruby,Devise,Cancan,Rails Admin,Ruby和Rails在这里都是全新的,我刚刚开始我的第一个项目。首先阅读了关于Lynda的新教程,然后开始了一个新项目,到目前为止,我正在使用RailsAdmin、CanCan和Desive 试图用CanCan做一些更高级的授权,我正在努力弄清楚如何做到这一点。对于普通用户,我现在正在做: can :access, :rails_admin can :dashboard can :read, [Company, ProductCategory] can [:read, :update], Use

Ruby和Rails在这里都是全新的,我刚刚开始我的第一个项目。首先阅读了关于Lynda的新教程,然后开始了一个新项目,到目前为止,我正在使用RailsAdmin、CanCan和Desive

试图用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
can :manage [Product, Catalog], [:company_id, :company.company.id, :company.company.company.id (etc)] => user.company.id
但显然我不能这样做,因为没有:product,只有文件所属产品的:product\u id。那么,我如何访问文件上的:product_id引用的产品的公司id呢

此外,一家公司可以是另一家公司的子公司(可以是另一家公司的子公司等)。那么,我将如何做类似于:

can :manage, [Image, Video, Document, Link], :product.company_id => user.company.id
can :manage [Product, Catalog], [:company_id, :company.company.id, :company.company.company.id (etc)] => user.company.id
基本上,用户应该能够管理属于其公司或属于其公司任何子公司的产品和目录


已编辑以清晰和简化

公司1有子公司2,公司2有子公司3,公司3有子公司4

用户属于公司2(不是公司1)

然后,用户应该从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和公司3。但是应该由第三行处理的Company4似乎没有显示在列表中,也不能由该用户管理


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

第一部分:

假设:

  • 用户属于公司
  • 产品属于公司所有
  • 形象属于产品
  • 文件属于目录
通过
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  } }
或者,如果产品有许多目录:

can :manage, Document, :catalog => { :company => user.company_id  }
can :manage, Document, :catalog => { :product => { :company => user.company_id  } }
第二部分:

假设:

  • 公司模型具有
    Company\u id
    以满足“公司有很多公司有很多公司等”的要求
因此,如果第一部分(用户可以管理公司):


就这些。在这里,公司树的嵌套方式并不重要,重要的是用户始终属于一家公司,无论是公司还是公司的子公司。

这非常有用,但我仍然有点挣扎(对于第二个问题,我可能没有很好地解释我的模型结构)。公司1有子公司2,公司2有子公司3,公司3有子公司4。产品1属于公司1,产品2属于公司2等等。但是,它仍然只是公司模型,有一些嵌套的关联,对吗?然而,如果你说的是这样一种情况,即如果用户可以管理公司1的资源,那么他也可以管理公司2..4-这将需要另一种方法,那么你知道为什么第1行和第2行有效,而不是第3行吗?我从你的评论中推测,在与CanCan?Company4的一行中不可能做到这一点。用户看不到/无法管理Company4。似乎它只能下降一级。比如我可以查询company.company,但不能查询company.company.company。你可以任意多次嵌套公司关联<代码>公司。第一。公司。公司。公司仍然很好。这只是模型关联的问题。