帮助使用数据库策略为特定模型实例中的用户提供角色

时间:2010-03-10 00:49:00

标签: ruby-on-rails declarative-authorization user-roles

我有一个使用声明性授权运行的ruby应用程序,我已经完成了这些角色:

admin(app admin) org_admin(组织管理员) org_colab(组织合作者) org_visitor(组织访问者)

用户可以拥有组织,他可以是管理员或合作者。

我使用Affiliation表链接它们

解决这个多对多角色的最佳策略是什么?

在Affiliation表上添加额外的属性? 喜欢:Affiliation(:user_id:integer,:organization_id:integer,:affiliation_type:integer)

对于org_admin,联属类型可以是0,对于org_colab可以是1,对于org_visitor可以是2,

我认为必须有更好的方法将角色分配给特定的组织......

2 个答案:

答案 0 :(得分:2)

这是经典的“用户组角色”模型。这是一种三元关系。用户组是多对多的; Group-Role也是如此。你需要五张桌来捕捉所有这些。

您将从User表开始。它会有一个主键(当然)。与组和角色相同。

您的E / R图表中的用户和组表之间会有一个UserGroup表。 UserGroup将有两列:user_id和group_id。主键是组合(user_id,group_id)。 user_id列将与User表的主键具有外键关系。同样适用于group_id列和Group表。

与Group和Role将有类似的安排。每个都有一个主键。 GroupRole表将位于E / R图中的两者之间。重复上面的措辞,你就会拥有它。

我会创建一个E / R图表来向您展示,但我正在忙着做其他事情。我希望这对你来说已经足够了。如果没有,也许我稍后会添加它。

所以用户没有角色;团体做。您将用户添加到组,该用户获得该组具有的所有授权。这样,您可以为特定组添加特定角色(例如,管理员组的管理员权限)。然后,添加到该组的每个人都将获得这些权限。

答案 1 :(得分:1)

我实际上实现了类似于我的项目的东西。为了澄清我是否理解您的正确性 - 您的用户可能在整个应用程序上下文中扮演角色,以及在组织上下文中可能不依赖于彼此的特定角色。

实用的解决方案可能是实现两个不同的角色集。让我们考虑以下结构:您有一个用户模型(具有应用程序范围的信息),一个组织模型(定义一个组织,可能由用户拥有)和一个定义一个关系的协作模型。用户和组织。

在这种情况下,最好将角色存储在用户模型中(执行应用程序范围的内容)并在协作模型中存储特定于组织的角色。

我在模型中使用了基于字符串的角色存储与ryan bates cancan-gem结合使用 - 它简单易用快速使用并将角色逻辑置于定义的位置。

这可能不适用于数千个不同的角色和组和东西,在这种情况下,您应该在额外的模型中实现角色存储(与用户和协作有多态关系)。

祝福 - 弗洛里安

编辑:要使ActiveRecord可以搜索该实现,您可能需要对:roles-field使用'serialize'功能,如ActiveRecord :: Base中所述。