繁體中文(香港)
  • saas
  • collaboration
  • organizations
  • rbac
  • multi-tenancy

幕後揭密:我們如何在多租戶應用程式中實現用戶協作

在多租戶應用程式中實現像 Logto Cloud 協作的邀請和角色訪問管理功能的實踐和見解。

Charles
Charles
Developer

Stop wasting weeks on user auth
Launch secure apps faster with Logto. Integrate user auth in minutes, and focus on your core product.
Get started
Product screenshot

背景

上週,我們在 Logto Cloud 上介紹了協作功能。如果你錯過了,快來看看!現在,你可以邀請同事和合作夥伴加入你現有的 Logto 租戶,一起合作維護你應用程式的身份系統。

在這次功能發布中,我們為每個 Logto 租戶新增了兩個角色:

  • 管理員:對租戶擁有完全訪問權限,包括管理身份相關資源、邀請和管理其他成員、處理計費及查看計費歷史。
  • 協作者:可以管理身份相關資源,但沒有進入其他管理員功能的權限。

為了與我們使用自己工具的承諾一致,我們利用我們的 RBAC(基於角色的存取控制)和組織功能來構建用戶協作。如果你是 RBAC 的新手,請查看我們的上一篇文章開始了解。

在這篇博客文章中,讓我們來看看實現這項功能的過程,以及這些做法若你在開發多組織應用程式時如何對你有幫助。

Logto Cloud 的協作是用 Logto 組織功能構建的

每個 Logto Cloud 租戶在我們的系統中作為一個獨立的組織運作,由我們的組織功能支援。為了引入租戶管理員和協作者角色,我們在組織模板中創建了兩個組織角色,每個角色都分配了一組特定的組織權限。

Organization roles
Organization scopes

使用 Logto 管理 API 處理邀請

我們在組織功能中提供了一組與邀請相關的管理 API。使用這些 API,你可以,例如:

  • POST /api/organization-invitations 創建並發送組織邀請到一個電郵地址
  • GET /api/organization-invitations & GET /api/organization-invitations/{id} 獲取你的邀請
  • PUT /api/organization-invitations/{id}/status 通過更新邀請狀態來接受或拒絕邀請

更多詳情,請參考完整 API 文件

與你的電郵連接器連接

由於邀請是通過電郵發送的,請確保你的電郵連接器已正確配置。在這次版本中,我們引入了一種類型為 OrganizationInvitation 的新電郵模板使用類型,允許自定義邀請電郵模板。

invitation email sample

此電郵模板將預設接受一個 {{link}} 變量,這是 Logto Console 登錄頁面的連結,使用者可以在這裡接受邀請並加入 Logto 租戶。Logto Cloud 中的一個登陸頁面的樣子如下圖所示:

invitation landing page

有關通過管理 API 發送邀請電郵的更多詳細信息,請參閱API 文件

使用 RBAC 管理用戶權限

有了上述設置,我們可以通過電郵發送邀請,受邀者可以以分配的角色加入組織。

具有不同組織角色的用戶在他們的訪問令牌中將擁有不同的範圍(權限)。因此,客戶端應用程式(Logto Console)和我們的後端服務應檢查這些範圍以確定可見功能和允許的操作。

好吧,到目前為止,一切似乎都是相互連接的,還有什麼是我們錯過的呢?

在訪問令牌中處理範圍更新

管理訪問令牌中的範圍更新包括:

  • 撤銷現有範圍:例如,將管理員降級為非管理員協作者,自動縮小在使用現有刷新令牌獲得的新訪問令牌中的範圍。
  • 授予新範圍:相反,將用戶提升為管理員需要觸發重新登錄或重新同意過程以反映用戶訪問令牌中的變更。

在 Logto Cloud 中,Console 使用 SWR 請求主動檢查用戶範圍,並且我們在用戶被提升為管理員時自動授權。

如果你正在使用 RBAC 實現類似功能,你將需要一種機制(例如,WebSocket 或伺服器推送事件)來通知你的應用程式範圍更新,從而啟用重新同意或相應地發放新訪問令牌。Logto 在未來的更新中也將提供更多的 Webhooks 來協助此過程。

總結

Logto Cloud 的多租戶和協作功能利用了我們的組織功能。如果你正在開發類似的多租戶應用程式,考慮使用這個功能以及類似的方式。

希望這篇博客文章能帶來啟發。如有問題或討論,隨時加入我們的Discord 頻道