幕后故事:我们如何在多租户应用中实现用户协作
在多租户应用中实现类似 Logto Cloud 协作的邀请和角色访问管理功能的实践与见解。
背景
上周, 我们在 Logto Cloud 上介绍了协作功能。如果你错过了, 快来看看吧!现在, 你可以邀请同事和合作伙伴加入你现有的 Logto 租户, 一起协作维护你应用的身份系统。
在此次功能更新中, 我们为每个 Logto 租户新增了两个角色:
- 管理员:对租户拥有完全访问权限, 包括管理与身份相关的资源、 邀请和管理其他成员、 处理账单、 查看账单历史。
- 协作者:可以管理与身份相关的资源, 但无权访问其他管理员功能。
秉持使用自家工具的承诺, 我们在构建用户协作时利用了我们的 RBAC(基于角色的访问控制)和组织功能。 如果你第一次接触 RBAC, 可以查看我们之前的文章 进行入门。
在这篇博客文章中, 我们将看看实现这一功能的过程, 以及这些实践如何在你开发多组织应用时为你提供帮助。
Logto Cloud 的协作功能是通过 Logto 组织实现的
每个 Logto Cloud 租户在我们的系统中作为一个独立组织运行, 由我们自家的组织功能支持。 为了引入租户管理员和协作者角色, 我们在组织模板中创建了两个组织角色, 每个角色都分配了特定的组织权限。
用 Logto Management API 处理邀请
我们在组织功能中提供了一组与邀请相关的管理 API。通过这些 API, 你可以, 例如:
POST /api/organization-invitations
创建并发送组织邀请到某个电子邮件地址GET /api/organization-invitations
与GET /api/organization-invitations/{id}
查询你的邀请PUT /api/organization-invitations/{id}/status
更新邀请状态以接受或拒绝邀请
更多详细信息, 请参阅完整的 API 文档。
连接你的电子邮件连接器
由于邀请是通过电子邮件发送的, 确保你的电子邮件连接器已正确配置。在此次更新中, 我们引入了一种新的电子邮件模板使用类型 OrganizationInvitation
, 允许自定义邀请电子邮件模板。
此电子邮件模板默认接受 {{link}}
变量, 这是到 Logto 控制台登录页的链接, 用户可以在此页面接受邀请并加入 Logto 租户。Logto Cloud 的某个登录页如下图所示:
关于如何通过管理 API 发送邀请邮件的更多详细信息, 请参阅API 文档。
使用 RBAC 管理用户权限
通过上述设置, 我们可以通过电子邮件发送邀请, 邀请对象可以以分配的角色加入组织。
拥有不同组织角色的用户将有不同的访问令牌范围(权限)。因此, 客户端应用(Logto 控制台)和我们的后端服务应该检查这些范围, 以确定可见功能和允许的操作。
好了, 目前看来一切都连接好了, 还有什么我们遗漏了吗?
在访问令牌中处理范围更新
管理访问令牌中的范围更新包括:
- 撤销现有范围:例如, 将管理员降级为非管理员协作者会自动缩小通过现有刷新令牌获取的新访问令牌中的范围。
- 授予新范围:相反, 提升用户为管理员需要触发重新登录或重新授权流程, 以反映用户访问令牌的更改。
在 Logto Cloud 中, 控制台使用 SWR 请求主动检查用户范围, 并在用户被提升为管理员时自动授权。
如果你使用 RBAC 实现类似的功能, 你需要一个机制(例如, WebSocket 或服务器推送事件)来通知你的应用范围更新, 从而启用重新授权或发放新访问令牌。Logto 还将在未来更新中提供更多 Webhook 以协助此类操作。
总结
Logto Cloud 的多租户和协作功能利用了我们的组织功能。如果你正在开发类似的多租户应用, 考虑利用这个功能并采用类似的方法。
希望这篇博文对你有所启发。如有任何问题或讨论, 欢迎加入我们的 Discord 频道。