【问题标题】:Multiple tables vs role-based authorization多表与基于角色的授权
【发布时间】:2016-02-20 03:40:56
【问题描述】:

问题

决定从基于角色的授权切换到为用户提供单独的表的用例是什么?当一种方法比另一种更易于实现/维护时,是否有设计模式或约定推荐?

详情

我正在构建一个 Rails 4.2+ 应用程序,但这个问题并不是严格意义上的 Ruby/Rails,尽管如果有 Rails 约定,我想听听它是什么。

在此应用程序中,客户输入并提交数据,但还需要能够查看其提交状态以及添加其他信息(文档、说明等...)。这就是客户所做的一切:提交数据、检查提交状态并获取电子邮件通知。如果客户决定将提交输入到多个帐户,它们可以关联到多个帐户。

另一方面,员工实际处理客户的提交并与单个帐户相关联。理论上,员工也有可能成为客户并拥有自己的提交内容。

每种类型的用户的“视图层”非常不同,每个人都扮演着非常不同的角色。这可以通过多个表以及基于角色的表来解决。

但是,每种类型用户的数据会有所不同。

例如,客户将个人信息输入到“客户”表以及多个关联表中,该客户将在系统中被视为“联系人”。

另一方面,员工不需要在系统中拥有相同级别的个人信息,因为该信息仅在处理提交时需要。不过,如前所述,员工可能会成为客户,如果我进行基于角色的授权,实施起来将是一场噩梦。

员工还将有额外的身份验证要求,例如两步身份验证(客户不需要此)。

当我查看这个应用程序时,我真正看到的是 2 个不同的应用程序一起运行:客户端和员工端。

我看过的大多数研究和问题似乎都在不断建议使用单个用户表并实施角色以进行授权。不过,这意味着我将在整个应用程序中使用大量条件。甚至在 SO 上的大多数其他开发人员(我在研究中遇到了几个类似的问题)似乎都看不起用户的多个表。

【问题讨论】:

    标签: ruby-on-rails-4 authentication authorization access-control abac


    【解决方案1】:

    你需要做的是

    1. 定义您的信息模型
    2. 定义您的授权要求
    3. 将授权要求与业务逻辑外部化/解耦。

    关于 3. 看看 ABAC () - 基于属性的访问控制。当您需要的内容无法通过 RBAC (NIST ABAC project page) 处理时,这是 NIST 推荐的访问控制模型。

    让我们看看你的用例:

    • 用户可以是客户或员工,甚至两者兼而有之
    • 用户可以属于多个帐户
    • 帐户包含提交内容
    • 提交的作品有创作者

    您的授权要求

    • 客户可以编辑他们创建的提交
    • 如果提交属于与该员工关联的帐户,则该员工可以处理提交
    • 客户可以查看他们所属帐户的所有提交

    修改您的需求“ABAC”样式

    • 客户可以查看他们所属帐户的所有提交

    变成

    • 当且仅当 submit.account 在 user.assignedAccounts 中时,具有角色 == client 的用户才能对类型 == submit 的对象执行操作 == 查看操作

    实施 ABAC

    有几种不同的方式来实现 ABAC。其中一种方法是使用 XACML,即可扩展访问控制标记语言 ()。 XACML 适用于许多不同的语言(Java、.NET、Ruby...)。XACML 有多种实现方式,例如 Axiomatics 或 SunXACML。

    在 Ruby 中,您还有一个名为 CanCanCan 的授权 gem。如果您正在寻找一种完全集成的基于 Ruby 的方法,那么 CanCanCan 是您最简单的选择。

    HTH

    【讨论】:

      【解决方案2】:

      我不习惯rails,所以我不确定在设计rails时是否应该有任何特殊考虑。这个问题似乎和认证无关,而是和授权有关

      所以你的系统有以下功能,

      • 客户

        1. 包含大量信息的个人资料
        2. 提交视图
        3. 提交/状态
      • 员工

        1. 处理提交
        2. 查看待处理/已处理的提交

      因此,如果您有客户角色和员工角色,这并不难,如果用户有客户资料,则用户可以看到相应的功能,员工也是如此。您可以根据需要设计表格,您可以有 3 个表格,用户、员工和客户,根据角色为用户填充适当的表格

      【讨论】:

        【解决方案3】:

        看看多租户。以下是可能方案的描述和概述:https://msdn.microsoft.com/en-us/library/aa479086.aspx

        我相信您的情况,因为您还需要查看所有用户数据,所以每个用户都有一个架构的数据库应该可以工作。这样所有表都具有相同的名称,只是另一个架构。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-01-01
          • 2012-04-11
          • 2020-02-16
          • 2017-12-14
          • 2017-04-12
          • 2018-07-21
          • 1970-01-01
          相关资源
          最近更新 更多