几天前,我的一些同事向我咨询了一款名为Makaut Buddy的开源应用程序的问题,这是一个为我们大学设计的笔记共享平台,旨在帮助学生有效地分享顶级笔记、过去的考试问题和YouTube教程。
虽然他们成功开发了上传资源的系统,但他们在确保只有授权个人才能上传内容方面遇到了挑战。
如下面的演示所示,任何用户注册后都可以创建资源。这带来了一个大问题,因为我们无法监管用户上传的内容,有些用户甚至可能上传了有害或令人不安的内容。
最初,他们定义了一个管理员角色,并授予一组选定的个人管理权限。然而,随着角色数量的增加,代码变得越来越复杂,难以管理。
正是在这个时候,我有了写这篇文章的想法,旨在提高人们对使用基于角色的访问控制 (RBAC) 模型以及借助第三方授权工具(如Permit)来有效管理授权的方法的认识。
除了实施 RBAC 之外,我们还引入了请求访问批准系统。该系统确保任何想要上传内容的用户都必须先请求访问权限,然后管理员可以批准或拒绝。这一额外的安全层有助于我们维护 Makaut Buddy 上内容的完整性。
在本文中,我使用JavaScript作为编程语言,使用Next.js作为框架。但是,这里讨论的概念并不特定于语言,您可以使用自己喜欢的编程语言来实现它们。
阅读完本文后,您将了解如何在应用程序中实现基本的 RBAC 模型。
话虽如此,让我们开始吧!
还记得那些匆忙赶往学校的早晨吗?保安检查你的身份证就是身份验证的完美例子。他们正在验证你作为获准进入校园的学生的身份。但这只是第一步。即使身份被确认,你也不会随便走进任何教室,对吧?这就是授权的作用所在。
将您的课程表视为您的授权。它根据您的角色(该课程的学生)授予您访问特定区域(教室)的权限。您无权进入教师休息室或图书馆的禁区 - 即使您是学生(经过身份验证)。
身份验证和授权之间的区别就像问“你是谁?”与“你可以做什么?”
授权在每个组织中都很重要,因为它可以防止个人执行未经授权的操作。这可确保组织的安全并有助于防止损失。
我们用一个例子来说明上面的说法:
在一家公司中,有一些经验丰富的高级工程师,也有一些仍在学习的实习生。你可以想象,如果高级工程师和实习生拥有相同级别的权限,将会导致多大的灾难。仍在学习的实习生可能会在不知情的情况下犯下一些错误,而公司将不得不为此付出代价。在这种情况下,基于角色的访问控制模型效果最好,因为权限不是分配给个人,而是分配给角色。例如,只有高级工程师或技术主管可以删除资源,而所有实习生只能查看和管理资源。
接下来,让我们看看如何在应用程序中实现 RBAC。
首先,我们需要定义角色并为每个角色分配权限。
注意:角色是某人在组织中的职位或目的,我们需要角色,以便我们可以根据分配给该角色的权限或特权来区分个人。
我们需要一种方法来为应用程序的每个用户分配角色。这通常在用户注册后完成。
我们需要一个后端 API,用于接收用户想要执行的操作并检查用户的授权。下图可以帮助您更好地理解:
但是,我们不会从头开始实现整个模型。相反,我们将使用第三方授权工具 Permit,这将使我们的整个授权过程变得非常顺畅和高效,这样您就可以处理真正重要的功能。
下图展示了我们如何利用 Permit 在我们的应用程序中实现 RBAC:
在本节中,我们将介绍使用 Permit 实现基于角色的访问控制 (RBAC) 的步骤。
由于我们使用许可证来建立 RBAC 模型,因此首先我们需要创建一个许可证账户和一个工作区:
现在我们需要创建一个资源,它是我们想要在应用程序中控制访问的实体。
例如,在笔记应用程序中,资源将是 Notes,操作可以是Create 、 Read、 Update和Delete。
要创建资源,请执行以下操作:
在上面的例子中,资源名称是 Notes,允许用户执行的操作是创建、读取、更新和删除。
创建资源后,我们必须定义应用程序中将存在的角色。
在这种情况下,由于该应用程序是一所大学的笔记共享应用程序,因此角色将是:
一旦我们创建了两个角色,我们现在必须从策略编辑器分配每个角色可以执行的操作,如下所示:
现在您的 Permit 帐户已配置完毕,您可以开始创建后端 API 来与 Permit 进行通信。我们将使用 Permit 提供的 Node.js SDK。您可以在 Permit 文档中找到您首选编程语言的 SDK。
同步用户并分配默认角色
首先,我们需要确保在我们的应用程序中注册的每个用户都同步到许可证目录并分配一个默认的学生角色。
为此,我们需要创建一个后端 API,如下所示:
此 API 可做两件事:
createUser
API 创建新用户。assignRole
API分配默认角色。
您可以在许可证文档中阅读有关 Permit 提供的所有 API 的更多信息
获取用户角色
接下来,我们需要创建一个后端 API,从Permit.io获取用户的角色并将其发送回前端。
下面显示的 API 使用permit.api.users.get(user_key)
获取用户
这个API可以获取用户角色,我们可以借此操作我们的前端组件,从而只有具有特殊角色的人才能看到它。
您还可以查看permit.check()函数来验证具有特定角色的用户是否被允许执行某项操作。
至此,我们已成功使用 Permit 实现了 RBAC 模型。现在,我们可以将后端路由与您选择的前端框架或库集成以完成设置。
为了完成我们的设置,我们需要一个允许用户请求角色升级的组件:
Permit Elements 是“Permit Share-If”的一部分,Permit Share-If 是一套预构建的可嵌入 UI 组件,可让您轻而易举地在应用程序中共享访问权限。Permit Elements 旨在提供功能齐全的访问控制,让将权限管理委托给您的用户变得简单而安全。
这就是我们创建的元素。
在使用这些元素之前,我们需要创建一个后端 API,用于将用户登录到 permit 元素,
注意:尽早让用户登录非常重要,最好是在注册后立即登录。
现在,让我们看一下代码:
在端点/api/v1/login_permit/?userkey=user_key
提供的 API 代码:
实现登录的前端代码如下:
就这样,我们就设置好了代码。
现在,我们只需要转到许可仪表板并复制用户管理 iframe 和访问请求 iframe,如下所示:
现在,一旦我们有了代码,我们就需要将iframe
添加到我们想要向用户显示元素的前端,我们需要:
由此,我们成功建立了一个访问批准系统,用户可以请求角色升级,管理员可以批准或拒绝这些请求。
此演示展示了具有“管理员”角色的用户如何访问上传小部件
此演示说明了具有“学生”角色的用户如何无法看到上传小部件并可以请求升级到“管理员”角色:
此演示展示了特权用户如何批准角色升级请求:
此演示演示了用户从“学生”升级为“管理员”后如何访问上传小部件
就是这样!
感谢您读到这里。
在本教程中,我们探索了授权并了解了为什么授权在任何应用程序中都非常重要。我们还研究了如何设置和配置 Permit 以保护应用程序并根据用户角色控制用户访问。
本文只是授权和 RBAC 模型的冰山一角。您可以研究 ABAC 和 ReBAC 以获得更细粒度的授权。