2010-03-10 70 views
3

我有一个声明授权运行的红宝石应用程序,我所做的角色给角色分配给用户数据库策略:帮助在特定模型实例

管理(应用程序管理员) org_admin(组织administratr) org_colab(组织合作者) org_visitor(组织访问者)

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

我链接使用所属表

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

要在联盟表上添加额外的属性? 像:单位(:USER_ID:整数,:的organization_ID:整数,:affiliation_type:整数)

和从属关系类型可以是用于对org_visitor 0 org_colab为org_admin和1和2?

我想必须有角色分配给特定的组织更好的方式...

回答

2

这是典型的“用户组 - 角色”的模式。这是一种三元关系。用户组是多对多的;群组角色也是如此。你需要五张表来捕捉它。

您将从用户表开始。它会有一个主键(当然)。与组和角色一样。

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

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

我会创建一个E/R图来展示给你,但我正忙于做其他一些事情。我希望这对你来说已经足够了。如果不是,那么稍后我可能会添加它。

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

+0

这是一个有点含糊了我。 让我们看看,我有这个: 用户* --- 1关联1 --- *组 我正在考虑在角色类型的关联表中添加一个额外的属性。 你能解释5列模型是怎么样的? – 2010-03-10 01:09:33

+1

不是五列模型,而是五表模型。您将拥有用户,组和角色表。您还将拥有UserGroup和GroupRole关系表以执行多对多关系。 – duffymo 2010-03-10 01:16:53

+0

好吧...... 我的用户组是我所属的表(USER_ID和GROUP_ID) ,但我不明白的GroupRole? (group_id&role_id)? 为什么本集团与角色而不是用户关联? – 2010-03-10 01:25:29

1

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

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

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

我在模型中使用了一个基于字符串的角色存储与ryan bates cancan-gem--其易于使用的&并将角色逻辑放置在指定位置。

这可能不适用于成千上万种不同的角色和组和东西的工作,在这种情况下,你应该实现角色存储在一个额外的模型(带有多态性关系到用户和collaboratives)。

最良好的祝愿 - 弗洛里安

编辑:要通过ActiveRecord的搜索,落实你可能想用“serialize'特征为:角色的字段,如的ActiveRecord :: Base的描述。

+0

感谢您的帮助Florian。 我正在使用一个与您的系统非常相似的系统,但不是使用cancan,而是编写了一个模块来管理所有逻辑问题并评估授权。这远非完美,我将尝试在未来学习其他方法,但目前它运行良好。 – 2010-08-28 07:33:10