Ruby on rails 4 多表与基于角色的授权

Ruby on rails 4 多表与基于角色的授权,ruby-on-rails-4,authentication,authorization,access-control,abac,xacml,Ruby On Rails 4,Authentication,Authorization,Access Control,Abac,Xacml,问题 决定从基于角色的授权切换到为用户提供单独的表的用例是什么?当一种方法的实施/维护比另一种更干净时,是否有一种设计模式或惯例建议 详细信息 我正在构建一个Rails 4.2+应用程序,但这个问题并不是严格意义上的Ruby/Rails,尽管如果Rails有一个约定,我想听听它是什么 在此应用程序中,客户输入并提交数据,但还需要能够查看其提交的状态以及添加其他信息(文档、澄清等)。这就是客户端所做的一切:提交数据、检查提交的状态以及获取电子邮件通知。如果客户端决定向多个帐户提交,则可以将它们关联

问题

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

详细信息

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

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

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

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

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

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

另一方面,工作人员不需要在系统中拥有相同级别的个人信息,因为这些信息只是处理提交文件所必需的。不过,正如前面提到的,员工可能会成为客户,如果我执行基于角色的授权,这将是一场噩梦

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

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


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

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

因此,您的系统具有以下功能:

  • 客户

  • 具有大量信息的个人资料
  • 意见书视图
  • 提交/状态
  • 职员

  • 处理意见书
  • 查看待处理/已处理的提交

因此,如果你有客户角色和员工角色,这并不难,如果用户有客户档案,用户可以看到适当的功能,员工也是如此。您可以根据需要设计表,您可以有3个表,即用户表、员工表和客户表,其中根据角色为用户填充适当的表。请看多租户。以下是可能方案的说明和概述:

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

您需要做的是
  • 定义您的信息模型
  • 定义您的授权要求
  • 将授权需求与业务逻辑外部化/解耦
  • 关于3。看看ABAC()-基于属性的访问控制。当您需要的东西无法通过RBAC()处理时,NIST建议使用这种访问控制模型

    让我们看看您的用例:
    • 用户可以是客户或员工,甚至两者都可以
    • 用户可以属于多个帐户
    • 帐户包含提交的内容
    • 投稿有创作者
    您的授权要求
    • 客户端可以编辑他们创建的提交
    • 如果提交的内容属于工作人员关联的帐户,则工作人员可以处理提交的内容
    • 客户可以查看其所属帐户的所有提交
    修改您的需求“ABAC”风格
    • 客户可以查看其所属帐户的所有提交
    变成

    • 当且仅当submission.account位于user.assignedAccounts中时,角色==客户端的用户可以对类型==submission的对象执行操作==查看
    实施ABAC 有几种不同的方法来实现ABAC。其中一种方法是使用XACML,这是一种可扩展的访问控制标记语言()。XACML适用于许多不同的语言(Java、.NET、Ruby…),XACML有几种实现,如Axiomatics或SunXACML

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