2

问题

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

细节

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

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

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

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

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

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

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

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

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

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

4

3 回答 3

1

你需要做的是

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

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

让我们看一下您的用例:

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

您的授权要求

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

重新设计您的需求“ABAC”风格

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

变成

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

实施 ABAC

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

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

HTH

于 2016-02-19T19:31:38.530 回答
0

我不习惯rails,所以我不确定在设计rails时是否应该有任何特殊考虑。此问题似乎与身份验证无关,但与授权有关

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

  • 客户

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

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

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

于 2016-02-18T23:42:03.760 回答
0

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

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

于 2016-02-19T09:44:25.707 回答