代码之家  ›  专栏  ›  技术社区  ›  JL Peyret

按访问权限对用户群体进行分类

  •  1
  • JL Peyret  · 技术社区  · 9 年前

    我想做的是根据员工的角色对他们进行分类 在组织中。这是通过获取所有权限来计算的,或者

    每个用户可能有10万个用户和数十个权限。

    编辑:当有大量用户时,绝大多数用户将拥有有限的权限集。例如,他们可能都有 Employee 只有更复杂的情况是电力用户,而且情况会更少。

    权限之间的隐含关系。

    import pprint
    pp = pprint.PrettyPrinter(indent=4)
    
    def classify(employees):
        """employees assigned the same set 
        of permissions are grouped together"""
        roles = dict()
        for user, permissions in employees.items():
            permissions = list(permissions)
            permissions.sort()
            key = tuple(permissions)
            members = roles.setdefault(key, set([]))
            members.add(user)
        return roles
    
    everyone = {
        "Jim": set(["Employee","Acct1","Manager"]),
        "Marion": set(["Employee","Acct1","Acct2"]),
        "Omar": set(["Employee","Acct1"]),
        "Kim": set(["Employee","Acct1"]),
        "Tyler": set(["Employee","Acct1"]),
        "Susan": set(["Employee","Marketing","Manager"]),
    }
    
    result = classify(everyone)
    print("pass1")
    pp.pprint(result)
    

    此时,分类系统返回以下信息:

    { ('Acct1', 'Acct2', 'Employee'): set(['Marion']), ('Acct1', 'Employee'): set(['Kim', 'Omar', 'Tyler']), ('Acct1', 'Employee', 'Manager'): set(['Jim']), ('Employee', 'Manager', 'Marketing'): set(['Susan'])}

    Senior Accountants - Marion
    Accounting Managers - Jim
    Accountants - Kim, Omar, Tyler
    Marketing Manager - Susan
    

    这项任务是手工完成的,但其目的是,即使员工被聘用或离职,以及权限发生变化,也要尽可能地保持“粘性”。

    我们再来一遍。

    有人决定重命名 Acct2 SrAcct .人们被雇用,金离开。

    everyone2 = { "Jim": set(["Employee","Acct1","Manager"]), "Marion": set(["Employee","Acct1","SrAcct"]), "Omar": set(["Employee","Acct1"]), "Tyler": set(["Employee","Acct1"]), "Milton": set(["Employee","JuniorAcct"]), "Susan": set(["Employee","Marketing","Manager"]), "Tim": set(["Employee","Marketing"]), }

    { ('Acct1', 'Employee'): set(['Omar', 'Tyler']), ('Acct1', 'Employee', 'Manager'): set(['Jim']), ('Acct1', 'Employee', 'SrAcct'): set(['Marion']), ('Employee', 'JuniorAcct'): set(['Milton']), ('Employee', 'Manager', 'Marketing'): set(['Susan']), ('Employee', 'Marketing'): set(['Tim'])}

    理想情况下,我们会认识到这一点

    Senior Accountants - Marion
    Accounting Managers - Jim
    Accountants - Omar, Tyler
    Marketing Manager - Susan
    new role - Tim
    new role - Milton
    

    蒂姆的角色现在将被命名为 Marketer Junior Accountant .

    重要的是,角色名称分配足够稳定,即使在员工被雇用和离职(最频繁)以及权限被添加或重命名(频率要低得多)时,也可以对员工群体进行推理。可以不时要求最终用户分配新的角色名或在关系之间做出决定。但在大多数情况下,它应该顺利进行。这是什么 不应该

    我的问题是很容易引起注意,但权限集和定义角色的用户集都可以更改。分类时间很重要,但这种分类机制的价值随着用户数量和权限的增加而增加。

    我尝试提取“定义角色的权限子集”。例如 分配给每个人,因此可以忽略。虽然 (Manager, Acct1) (Manager, Marketing)

    我现在想的是返回并计算每一代的新员工权限角色分类,然后回溯以获得与前一代相比的模糊匹配“最佳匹配”。选择那些合理明确的角色,并要求用户决定关系,并根据需要分配新的角色名称。

    例如,权限的精确匹配和员工的合理匹配意味着 'Omar', 'Tyler' 仍然是 Accountants "Jane": set(["Employee","Acct1","SrAcct"]) ,我必须要求最终用户进行仲裁,并确定她是 Senior Accountant .

    Jaccard相似性 ( https://en.wikipedia.org/wiki/Jaccard_index )在过去,但我不确定它如何适用于双方都可以改变的情况( => 以及员工变动)。

    机器学习 张量流 不过,如果情况紧急,我可以调用一批进行匹配。

    3 回复  |  直到 9 年前
        1
  •  1
  •   Ofer Sadan    9 年前

    这将是一个一般的答案,非常抱歉,但您的问题非常广泛,需要一些逻辑,而不是一些特定的代码。

    也许这个问题可以用“标签”来更好地解决?我的意思是,一个人可以同时是一名员工、一名营销人员和一名经理(我想这三个人都有权限)。

    这样你就可以确定,当一个新员工进入时,通过查看他的权限并决定他适合的位置,他会得到适当的标签。当员工离开时,这没有什么区别,因为他不会单独影响权限和标签。

        2
  •  1
  •   Brendan Abel    9 年前

    你在这里真正创建的是一棵组织层次结构树。您的分组算法已经能够做到这一点。您不会在单个层次结构中显示它们,但它们可以很容易地以这种方式显示。

    组织的“主观”部分是决定何时适合将分支机构合并为单个组织角色,并决定在创建分支机构时按何种顺序对权限进行排序(即,您希望有一个部门低于该部门的经理分支机构,还是希望有一个部门分支机构,每个部门都包含一个经理分支机构)。

    不幸的是,机器无法了解这些偏好。你必须做出所有这些决定,特别是如果你需要0%的假阳性率。

    第二点信息可能会以交互方式提供。给定整个组织结构图的显示,您可以选择哪些权限集应合并到单个组织结构集中。在这里,您还可以为每个权限集组分配角色的显示名称。

    就能够对雇佣/解雇做出响应而言,只要权限相同,就不应该成为问题。就添加和删除用户权限而言,您必须存储以前的权限和分组,并将其与每个用户的当前权限相匹配,以提示某人批准对角色权限集的更改,或使用新权限形成新分支。

        3
  •  0
  •   JL Peyret    9 年前

    这就是我最后要做的:

    1. 在计算新用户/访问集的分类之前,请保存旧用户及其分配的名称。

      • 完全权限匹配?再一次,这是一场比赛。再次,通过集合对字典进行排序元组转换查找进行检查。

      • calc 最后一步,如果与下一个最接近的匹配存在足够大的差异,则仅自动选择一个。

        class Match(object):
    
            #these are weighing coefficients - I consider roles/permissions more important because of the expected user churn.
            con_roles = .7
            con_users = .3
            con_other = .07
    
            threshold = .7
    
            def calc(self):
                #could have anything you want here, really.
                self.similarity = self.con_roles * self.simroles + self.con_users * self.simusers
    

    好的,我遗漏了很多,但基本上,你可以对用户和角色应用一个简单的Jaccard相似性算法,并将这些数字放入一个合适的等式中,看看什么是紧密匹配。如果不满意,作为最后手段,请用户再次指定名称。

    如果有人最终寻找类似的东西,希望这会对他们有所帮助。