多个表与基于角色的授权

时间:2016-02-18 17:55:44

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

问题

决定从基于角色的授权切换到为用户提供单独的表的用例是什么?是否存在一种设计模式或约定,建议何时一种方法比另一种方法更清洁?

详情

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

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

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

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

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

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

另一方面,工作人员不需要在系统中具有相同级别的个人信息,因为该信息仅用于处理提交。如前所述,工作人员可能成为客户,如果我做了基于角色的授权,那将是一个实施的噩梦。

员工还将有其他身份验证要求,例如两步身份验证(客户端不需要此操作)。

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

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

3 个答案:

答案 0 :(得分:1)

您需要做的是

  1. 定义您的信息模型
  2. 定义您的授权要求
  3. 将授权要求与业务逻辑外部化/解耦。
  4. 关于3.查看ABAC() - 基于属性的访问控制。它是NIST建议的访问控制模型,无法通过RBAC(NIST ABAC project page)处理您需要的内容。

    让我们来看看你的用例:

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

    您的授权要求

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

    重新制定您的要求' ABAC'式

    • 客户可以查看其所属帐户的所有提交内容

    变为

    • 当且仅当submission.account在user.assignedAccounts
    • 中时,具有role == client的用户可以对type == submission的对象执行action == view

    实施ABAC

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

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

    HTH

答案 1 :(得分:0)

我不习惯使用rails,因此我不确定在设计rails时是否应该有任何特殊注意事项。此问题似乎与身份验证无关,但具有授权

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

  • 客户

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

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

因此,如果您有客户角色和员工角色,那么并不难,如果用户具有客户端配置文件,则用户可以看到相应的功能,同样适用于员工。您可以根据需要设计表,您可以拥有3个表,用户,员工和客户端,根据角色为用户填充适当的表

答案 2 :(得分:0)

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

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