首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用cancancan的多级授权

使用cancancan的多级授权
EN

Stack Overflow用户
提问于 2019-07-27 17:01:15
回答 1查看 168关注 0票数 1

我正面临着挑战。一个多层次的授权系统和一个朋友告诉我,cancancan可以帮到我。

我读了一遍文档,但搞不懂。所以我在这里解释。我的目标是创建一个sys:

  • 来自南方部门的"John“用户创建Jane
  • 用户Jane创建六月的保罗
  • 用户琼和保罗创造鲍勃,纳特和艾米丽

也是

  • 北方部门的用户Peter创建了Rita
  • 用户Rita创建Becca和Lisa
  • 用户Becca和Lisa创建Clara、Lory和Alexa

现在,每个用户只能看到自己创建的记录,或者是来自低于,但不是以上或来自其他部门的用户的记录。

我该怎么从模特和一切开始呢?

EN

回答 1

Stack Overflow用户

发布于 2019-07-28 12:21:23

首先,您需要在数据库级别跟踪此树。为此,可以向users表添加一个users引用,该表将引用创建该特定用户的用户。对于未由任何人创建的用户,此列将为空,否则将保存父用户的id。为了保证引用的完整性,我强烈建议使用外键。

然后,您将需要以正确遍历树结构的方式定义您的CanCanCan能力。您可以将从医生们派生的这个示例作为参考

代码语言:javascript
复制
class Ability
  def initialize(user)    
    can :read, Photo, Book do |resource|
      resource.creator.descendant_of? user
    end
  end
end

假设User模型有一个descendant_of?方法,它从当前用户遍历树到根,检查给定用户是否是资源创建者的父级。可能的实现如下所示:

代码语言:javascript
复制
# app/models/user.rb

def descendant_of?(target_user)
  parent_id == target_user.id || parent&.descendant_of?(target_user)
end

根据用户树的特性,该建议在效率方面可能很快就会变差,因为从所有者到根的所有用户都可能从数据库加载以执行这些检查。这里有几个想法是值得探讨的,以防你开始面对这些问题:

  1. parent_ids列使用类似数组的类型来存储父ids的整个列表。我在这个建议中看到的主要缺点是,如果树中有更改,并且引用完整性约束丢失,它会增加一些开销(AFAIK在此场景中不可能添加外键)。
  2. 除了上述建议之外,还应修改CanCanCan功能,以便直接针对数据库运行查询,而不是在内存中执行该检查(执行ruby代码)。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57234297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档