最佳基于角色的访问控制(RBAC)数据库模型
Posted
技术标签:
【中文标题】最佳基于角色的访问控制(RBAC)数据库模型【英文标题】:Best Role-Based Access Control (RBAC) database model [closed] 【发布时间】:2010-09-16 10:58:39 【问题描述】:跟踪 Web 应用程序基于角色的访问控制的最佳数据库架构是什么?
我正在使用 Rails,但 Google 链接的 RBAC 插件看起来没有维护(只有 300 次提交到 SVN;最新的是差不多一年前)。
这个概念足够简单,可以从头开始实施,但又足够复杂和重要,值得一试。
那么其他人如何构建和实施他们的 RBAC 模型?
【问题讨论】:
使用为您实现授权的框架。查看 CanCanCan 或其他基于属性的访问控制 (ABAC) 模型,例如XACML 【参考方案1】:我真的很喜欢这篇博文:https://content.pivotal.io/blog/access-control-permissions-in-rails
编辑:
railscasts 的 ryanb 似乎也有同样的想法,并使用类似于 pivotollabs 帖子的基本技术创建了一个名为 cancan https://github.com/ryanb/cancan 的 gem。
【讨论】:
【参考方案2】:RBAC 简介 -
基于角色的访问控制系统是一种根据组织用户的角色限制对“某些来源或应用程序或应用程序的某些功能”的访问的方法。
这里的限制可以是多个权限,由管理员创建来限制访问,这些权限共同代表一个角色,将分配给用户。
如果我们在 RBAC 中再深入一点,它基本上包含 3 个特征。
1) 身份验证 - 它确认用户的身份。通常是通过用户帐户和密码或凭据来完成的。
2) 授权 - 它定义了用户在应用程序中可以做什么和不能做什么。前任。允许“修改订单”,但不允许“创建新订单”。
3) 审核用户对应用程序的操作。 - 它跟踪用户在应用程序上的操作,以及谁授予了哪些用户访问权限?
这是非常基本的 RBAC 系统俯视图。
RBAC系统的基本结构可以包含以下组件: 用户、角色、权限或限制、资源。
权限或限制 – 权限表示访问 应用程序的资源。 角色 - 它包含权限集合 用户 – 分配给用户的单个或多个角色,因此最终用户 通过角色包含权限。除此之外,如果您想支持复杂的场景,您还可以拥有用户集合 - 称为 - 组,并且可以将角色分配给组。 所以,这是关于 RBAC 结构的非常基本的信息。
【讨论】:
【参考方案3】:试试https://github.com/ThoughtWorksStudios/piece,它是一个规则引擎,供您管理基于用户角色的访问控制:
-
定义访问控制规则
组合规则以构建新规则
您可以在此处找到完整的 Rails 应用程序示例:https://github.com/xli/piece-blog
【讨论】:
【参考方案4】:这是一个简单的图表来说明Amr Mostafa's excellent answer
【讨论】:
您不必使用 UserRoleID 和 RolePermissionID。而不是在 User_Role 中,UserID 和 RoleID 的组合应该是唯一的并且是主键。这与具有 RoleID 和 PermissionID 的 Role_Permission 表相同。 不错的图表,但您恰好漏掉了资源模型... 这张图是错误的。User
one-to-many
User_Role
many-to-one
Role
one-to-many
Role_Permission
@ 987654330@Permission
。并且 Resource 实体被省略。【参考方案5】:
我认为你的问题的答案是你想去的深度。如果您碰巧考虑将角色放入组中,然后将组与用户相关联是不够的。最终,您需要在特定对象(论坛、视频等)上向用户授予特定权限。
我更接近于 Yuval 的回答,我们所需要的只是关联项目范围的对象 + 操作 + 用户。提供这个;基础对象(实体)非常有意义。任何从 Entity 继承的对象都可以通过这种方式轻松地与用户 + 操作相关联。
您也希望保持简单;我的建议是;
由于 rbac 限制,任何对象都应派生自基础实体。 应该有一个角色列表,这些角色与实体是一对一的。 应该有一个用户和角色之间的关系列表。为了更进一步,我还推荐以下内容(用于自动 rbac)
我对我的对象使用基于服务的访问。那是;我创建对象存储库(它为我执行 db-access)并通过服务函数访问存储库。 我在每个服务函数的开头使用了一个自定义属性。这定义了访问该功能所需的角色。 我使用 User 参数访问我的所有服务功能,每个服务功能在执行之前都会进行角色检查。反射帮助我了解我调用了哪个函数,以及它具有什么样的角色(通过自定义属性) 我还在我的应用程序启动时运行了一个初始化程序,它检查所有函数(及其属性)并查看我是否添加了新的必需角色。如果我刚刚添加了一个角色,但它似乎不在 db 上,它会在 db 上创建它。但是,唉,这仅适用于 .NET,据我所知 Java 没有自定义属性,因此 Java 还不太可能使用。
我想提出一些代码示例,但我懒得做。如果您对我的 rbac 方式有疑问;你可以在这里问,我一定会回复的。
【讨论】:
【参考方案6】:我正好在他们工作的时候在这里研究 RBAC 子系统……真是巧合。
我的模型基于系统中需要权限的不同实体的构建块,无论是查看/更新的属性还是要执行的操作。当然,系统中也有不同的角色(可以赋予用户),而将整个事物结合在一起的粘合剂是访问规则,它连接特定角色、特定需要权限的实体和授予的权限。访问规则可能如下所示:
rule 14: guest role + page name + read permission
rule 46: approver role + add column + execute permission
等等。我会将 ERD 作为练习留给读者;-) 如果您有任何问题,请发表评论。
尤瓦尔=8-)
【讨论】:
创建资源时,如何决定分配给它的角色和权限?你是从父母那里继承的吗?这就是我感到困惑的部分。如果您将其留空,让“某人”为其分配角色和权限,这将成为系统的巨大管理开销。 这确实是一种开销,必须由编写资源的开发人员或负责此跨应用程序功能的人员来处理。这有点像同步代码……要么到处出现,要么就不行。【参考方案7】:就我在该领域的基本知识而言,RBAC 的基本参与者是:
资源。 权限。 用户。 角色(即组)。资源 (一个或多个)权限。
角色 (一个或多个)权限的集合。
用户 (一个或多个)角色。
这种模型的表格是:
许可 角色 用户 role_permission 用户角色如果您希望应用程序的用户能够配置资源所需的权限,现在您可能还希望在此处包含资源。但我从来不需要那个。希望对您有所帮助。
【讨论】:
当您说“资源需要(一个或多个)权限”时,我假设这是针对该资源的 UI,它允许用户为每个权限设置允许/拒绝值对于每个用户...对吗?如果是这样,那么在您的数据库模式中,您可能有 10、20(或更多)个可能的资源与单个权限相关联。例如,“项目经理”具有“创建”权限。然后,您会将此类权限与项目、计划、任务、文档、时间表资源(仅举几例)相关联,因为项目经理可能会创建所有这些资源?谢谢! 我在概念上理解这一点,但核心值的表结构可能是什么样的? 我如何对相似的权限进行分组,以帮助我在前端显示相同的权限? 您可能需要考虑 AERBAC researchgate.net/profile/D_Kuhn2/publication/… “RBAC 和 ABAC 各有其特殊的优点和缺点。RBAC 将前期角色结构工作换成易于管理和用户权限审查,而 ABAC 则相反权衡取舍:易于设置,但分析或更改用户权限可能会出现问题。” 权限表中究竟应该包含什么?可以举个例子吗?【参考方案8】:Role Requirement 与 Restful Authentication 配合得非常好,可以提供基于角色的身份验证功能,并且维护良好。
【讨论】:
网页说它不再维护:-( 是的,几年有多大的不同。 :) 就我个人而言,我已经开始使用 Devise 进行身份验证,并结合使用自己的角色分配和 CanCan 来满足我的大部分授权需求。在观看 Railscasts #192 (railscasts.com/episodes/192-authorization-with-cancan) 之后,我开始了这条道路。我是存储用户角色的二进制掩码方法的粉丝。【参考方案9】:对于 .net 应用程序,您应该查看 Visual Guard http://www.visual-guard.com/ 之类的内容,以避免必须从头开始处理权限和角色。
对于 .net,您还可以通过配置处理成员资格和角色提供者以及授权。 http://www.odetocode.com/Articles/427.aspx
【讨论】:
【参考方案10】:您可以使用Restful ACL Rails plugin。
【讨论】:
RESTful_ACL 很好,但是没有内置的基于角色的控制概念,所以这实际上不是一个 RBAC 解决方案。 好吧,我认为 Rbac != ACL。以上是关于最佳基于角色的访问控制(RBAC)数据库模型的主要内容,如果未能解决你的问题,请参考以下文章