帮助在特定模型实例中为用户分配角色的数据库策略
Posted
技术标签:
【中文标题】帮助在特定模型实例中为用户分配角色的数据库策略【英文标题】:Help with database strategy for giving roles to users in specific model instances 【发布时间】:2011-01-25 16:56:49 【问题描述】:我有一个使用声明式授权运行的 ruby 应用程序,并且我已经创建了角色:
管理员(应用管理员) org_admin(组织管理员) org_colab(组织合作者) org_visitor(组织访问者)
用户可以拥有_many 个组织,他可以是管理员或合作者。
我使用从属关系表链接它们
解决这种多对多角色的最佳策略是什么?
要在 Affiliation 表上添加一个额外的属性? 比如:隶属关系(:user_id:integer, :organization_id:integer, :affiliation_type:integer)
并且从属类型可以是 0 代表 org_admin,1 代表 org_colab,2 代表 org_visitor?
我想一定有更好的方法来为特定组织分配角色...
【问题讨论】:
【参考方案1】:我实际上实现了与我的项目类似的东西。为了澄清我的理解是否正确 - 您的用户可能在整个应用程序上下文中扮演一个角色,以及在组织上下文中可能不依赖于彼此的特定角色。
一个实用的解决方案可能是实现两个不同的角色集。让我们考虑以下结构:您有一个用户模型(具有应用程序范围的信息)、一个组织模型(定义一个组织并且可能由用户拥有)和一个协作模型,它定义了一个用户和组织。
在这种情况下,最好将角色存储在用户模型(执行应用程序范围的工作)中,并将特定于组织的角色存储在协作模型中。
我在模型中使用了基于字符串的角色存储,并结合了 ryan bates canscan-gem - 它易于使用且快速,并将角色逻辑放置在定义的位置。
这可能不适用于数千个不同的角色和组以及其他东西,在这种情况下,您应该在额外的模型中实现角色存储(与用户和协作具有多态关系)。
最好的祝愿 - 弗洛里安
编辑:要使 ActiveRecord 可以搜索该实现,您可能希望对 :roles-field 使用“序列化”功能,如 ActiveRecord::Base 中所述。
【讨论】:
感谢您的帮助弗洛里安。我使用的系统与您的系统非常相似,但我没有使用 cancan,而是编写了一个模块来管理所有逻辑问题并评估授权。它远非完美,将来我会尝试学习其他方法,但目前还可以。【参考方案2】:这是经典的“用户-组-角色”模型。是三元关系。用户组是多对多的;组角色也是如此。您需要 5 个表格来记录所有内容。
您将从用户表开始。它会有一个主键(当然)。与组和角色相同。
您将在 E/R 图中的 User 和 Group 表之间有一个 UserGroup 表。 UserGroup 将有两列:user_id 和 group_id。主键将是组合 (user_id, group_id)。 user_id 列将与 User 表的主键有外键关系。 group_id 列和 Group 表也是如此。
Group 和 Role 会有类似的安排。每个都有一个主键。 GroupRole 表将位于 E/R 图中的两者之间。重复上面的措辞,你就会得到它。
我会创建一个 E/R 图来向您展示,但我正忙于做其他事情。我希望这对你来说已经足够了。如果没有,也许我会在以后添加它。
所以用户没有角色;团体可以。您将用户添加到组中,该用户将获得该组拥有的所有权限。这样,您可以为特定组添加特定角色(例如,管理员组的管理员权限)。然后添加到该组的每个人都将获得这些权限。
【讨论】:
这对我来说有点模糊。让我们看看,我有这个: User * ---1 Affiliation 1--- * Group 我想在 Affiliation 表中为角色类型添加一个额外的属性。你能解释一下 5 列模型是怎样的吗? 不是五列模型,五表模型。您将拥有用户、组和角色表。您还将拥有 UserGroup 和 GroupRole 关系表来承载多对多关系。 好的...我的 UserGroup 是我的 Affiliation 表( user_id 和 group_id ),但我不明白 GroupRole 吗? (group_id & role_id) ?为什么组要与角色而不是用户相关联? 我想我明白你在说什么。使用该模型,我可以让 user1、user2 和 user3 属于一组管理员,因此他们都是管理员。但我所追求的是类似的。 user1、user2 和 user3 属于一个组织。 user1 是管理员,user2 是经理,user3 是客户端。这不是将角色分组的情况,而是将用户分组到一个组并让他们在该组中具有特定的角色...... 我同意 - 听起来你有多对多的关系,所以你需要连接表。您最了解自己的情况 - 适当地建模。祝你好运。以上是关于帮助在特定模型实例中为用户分配角色的数据库策略的主要内容,如果未能解决你的问题,请参考以下文章
使用用户 SPI 在 Keycloak 中为外部用户分配角色