HTMLTAG_67__HTMLTAG_68___1。組織 — 概述___HTMLTAG_69__HTMLTAG_70
Keycloak 組織是一項允許在單一領域中進行 多重租戶管理的功能。您可以在領域內建立 組織 以對使用者進行分組、管理網域並按組織控制訪問,而不是為每個組織(租用戶)建立多個領域。
這是 B2B(企業對企業)和 B2B2C(企業對企業對消費者)平台的一項重要功能,也稱為CIAM(客戶身分與存取)管理).
HTMLTAG_85__HTMLTAG_86___1.1 使用案例___HTMLTAG_87__HTMLTAG_88
___HTMLTAG_91__HTMLTAG_92___情境___HTMLTAG_93__HTMLTAG_94___說明___HTMLTAG_95__HTMLTAG_96___ ___HTMLTAG_99__HTMLTAG_100__HTMLTAG_101___SaaS 多租戶___HTMLTAG_102__HTMLTAG_103__HTMLTAG_104___每個客戶公司都是一個組織,使用者屬於其組織____HTMLTAG_105__HTMLTAG_106___ ___HTMLTAG_107__HTMLTAG_108__HTMLTAG_109___B2B 入口網站____HTMLTAG_110__HTMLTAG_111__HTMLTAG_112___合作夥伴/供應商有自己的組織,合作夥伴員工透過組織存取入口網站____HTMLTAG_113131413134__ ___HTMLTAG_115__HTMLTAG_116__HTMLTAG_117___有子公司的企業___HTMLTAG_118__HTMLTAG_119__HTMLTAG_120___公司有多個子公司,每個子公司都是一個組織____HTMLTAG_1211HTMLTAG_122___ ___HTMLTAG_123__HTMLTAG_124__HTMLTAG_125___教育平台____HTMLTAG_126__HTMLTAG_127__HTMLTAG_128___每個學校/機構是一個組織,教師/學生是成員____HTMLTAG_129__HTMLTAG_130___組織是 Keycloak 25+ 中提供的功能。啟用:
HTMLTAG_139__HTMLTAG_140___2.1 在領域啟用___HTMLTAG_141__HTMLTAG_142
預編碼_0
HTMLTAG_143__HTMLTAG_144___2.2 檢查狀態___HTMLTAG_145__HTMLTAG_146
預編碼_1
HTMLTAG_147__HTMLTAG_148___3。建立和管理組織___HTMLTAG_149__HTMLTAG_150
HTMLTAG_151__HTMLTAG_152___3.1 透過管理控制台建立組織___HTMLTAG_153__HTMLTAG_154
轉至 管理控制台 → 組織 → 建立組織:
___HTMLTAG_161__HTMLTAG_162___欄位____HTMLTAG_163__HTMLTAG_164___說明____HTMLTAG_165__HTMLTAG_166___範例____HTMLTAG_167__HTMLTAG_168___ ___HTMLTAG_171__HTMLTAG_172__HTMLTAG_173___名稱___HTMLTAG_174__HTMLTAG_175__HTMLTAG_176___組織名稱(必填)___HTMLTAG_177__HTMLTAG_178__HTMLTAAc_179______ Corporation___HTMLTAG_180__HTMLTAG_181__HTMLTAG_182___ ___HTMLTAG_183__HTMLTAG_184__HTMLTAG_185___別名___HTMLTAG_186__HTMLTAG_187__HTMLTAG_188___自行產生的唯一別名__ _HTMLTAG_189__HTMLTAG_190__HTMLTAG_191___acme-corporation___HTMLTAG_192__HTMLTAG_193__HTMLTAG_194___ ___HTMLTAG_195__HTMLTAG_196__HTMLTAG_197___說明___HTMLTAG_198__HTMLTAG_199__HTMLTAG_200___組織說明____HTMLTAG_201__HTMLTAG_202__HTMLTAG_203___Acme Corp -企業客戶___HTMLTAG_204__HTMLTAG_205__HTMLTAG_206___ ___HTMLTAG_207__HTMLTAG_208__HTMLTAG_209___重定向網址___HTMLTAG_210__HTMLTAG_211__HTMLTAG_212___會員貼文輸入後的網址重新導向____HTMLTAG_213__HTMLTAG_214__HTMLTAG_215__URL_1___>___HTMLTAG_216__HTMLTAG_217___HTMLTAG_220__HTMLTAG_221___3.2 透過 REST API 建立組織___HTMLTAG_222__HTMLTAG_223
預編碼_2
HTMLTAG_224__HTMLTAG_225___4。組織域___HTMLTAG_226__HTMLTAG_227
組織網域允許 根據電子郵件網域自動將使用者與組織 關聯。當使用者使用屬於註冊網域的電子郵件註冊或登入時,Keycloak 可以自動將使用者附加到相應的組織。
預編碼_3
___HTMLTAG_232__HTMLTAG_233___域狀態:HTMLTAG_234__HTMLTAG_235
___HTMLTAG_238__HTMLTAG_239___狀態___HTMLTAG_240__HTMLTAG_241___說明___HTMLTAG_242__HTMLTAG_243___ ___HTMLTAG_246__HTMLTAG_247__HTMLTAG_248___已驗證___HTMLTAG_249__HTMLTAG_250__HTMLTAG_251___已驗證網域 - 擁有此電子郵件網域的使用者將自動取得組織資格__MLTAG_253 ___HTMLTAG_254__HTMLTAG_255__HTMLTAG_256___未經驗證___HTMLTAG_257__HTMLTAG_258__HTMLTAG_259___未經驗證的網域 - 僅用於匹配,需要管理員批准____HTMLTAG_260__HTMLTAG_261___| 已驗證網域 - 擁有此電子郵件網域的使用者將自動取得組織資格 |
- 域僅屬於 單一組織__HTMLTAG_271__HTMLTAG_272___
- 域驗證有助於確保組織實際擁有該網域
- 子網域比對:
acme.com將符合[email protected]但 不 ___MLTAG_281符合[email protected]___HTMLTAG_283__HTMLTAG_284___
HTMLTAG_286__HTMLTAG_287___5。組織屬性___HTMLTAG_288__HTMLTAG_289
自訂屬性允許為組織保存其他元資料:
預編碼_4
屬性可用來:
___HTMLTAG_295__HTMLTAG_296___令牌聲明 — 新增組織元資料以存取/ID 令牌
___HTMLTAG_299__HTMLTAG_300___授權策略 — 基於屬性的授權
___HTMLTAG_303__HTMLTAG_304___自訂邏輯__HTMLTAG_305___ — 處理應用程式中的業務邏輯
HTMLTAG_308__HTMLTAG_309___6。管理會員___HTMLTAG_310__HTMLTAG_311
HTMLTAG_312__HTMLTAG_313___6.1 託管成員與非託管成員___HTMLTAG_314__HTMLTAG_315
___HTMLTAG_318__HTMLTAG_319___類型____HTMLTAG_320__HTMLTAG_321___說明____HTMLTAG_322__HTMLTAG_323___範例____HTMLTAG_324__HTMLTAG_325___
___HTMLTAG_328__HTMLTAG_329__HTMLTAG_330___託管___HTMLTAG_331__HTMLTAG_332__HTMLTAG_333___使用者完全由組織管理 -生命週期與組織綁定___HTMLTAG_334__HTMLTAG_335___公司員工:離開組織時,帳戶將被停用___HTMLTAG_336__HTMLTAG_337___
___HTMLTAG_338__HTMLTAG_339__HTMLTAG_340___非託管___HTMLTAG_341__HTMLTAG_342__HTMLTAG_343____免費用戶,僅「加入」組織 —帳戶獨立存在____HTMLTAG_344__HTMLTAG_345____自由工作者、承包商:可以屬於多個組織___HTMLTAG_346__HTMLTAG_347___
HTMLTAG_350__HTMLTAG_351___6.2 將現有使用者加入組織___HTMLTAG_352__HTMLTAG_353
預編碼_5
HTMLTAG_354__HTMLTAG_355___6.3 成員角色___HTMLTAG_356__HTMLTAG_357
可以在組織情境中為組織成員指派角色:
___HTMLTAG_362__HTMLTAG_363___角色___HTMLTAG_364__HTMLTAG_365___說明___HTMLTAG_366__HTMLTAG_367___
___HTMLTAG_370__HTMLTAG_371__HTMLTAG_372___成員___HTMLTAG_373__HTMLTAG_374__HTMLTAG_375___預設角色 — 標準存取___HTMLTAG_376__HTMLTAG_377___
___HTMLTAG_378__HTMLTAG_379__HTMLTAG_380___管理員___HTMLTAG_381__HTMLTAG_382__HTMLTAG_383___組織管理員 — 可以管理成員和設定____HTMLTAG_384__HTMLTAG_385___
HTMLTAG_388__HTMLTAG_389___7。邀請管理___HTMLTAG_390__HTMLTAG_391
Keycloak 組織支援 邀請使用者透過電子郵件邀請加入組織。
HTMLTAG_396__HTMLTAG_397___7.1 傳送邀請___HTMLTAG_398__HTMLTAG_399
預編碼_6
HTMLTAG_400__HTMLTAG_401___7.2 邀請狀態___HTMLTAG_402__HTMLTAG_403
___HTMLTAG_406__HTMLTAG_407___狀態___HTMLTAG_408__HTMLTAG_409___說明___HTMLTAG_410__HTMLTAG_411___
___HTMLTAG_414__HTMLTAG_415__HTMLTAG_416___待處理___HTMLTAG_417__HTMLTAG_418__HTMLTAG_419___邀請已發送,但未接受__HTMLTAG_420__HTMLTAG_421___邀請已發送,但未接受__HTMLTAG_420__HTMLTAG_421___
___HTMLTAG_422__HTMLTAG_423__HTMLTAG_424___已過期___HTMLTAG_425__HTMLTAG_426__HTMLTAG_427___邀請可設定過期___HTMLTAG_428__HTMLTAG_429___
HTMLTAG_432__HTMLTAG_433___7.3 管理邀請___HTMLTAG_434__HTMLTAG_435
預編碼_7
___HTMLTAG_436__HTMLTAG_437___電子郵件範本: Keycloak 使用位於 領域設定 → 電子郵件 → 範本 的可自訂範本傳送電子郵件。預設模板包含一個鏈接,供用戶接受邀請並建立帳戶(如果他們沒有帳戶)。
HTMLTAG_442__HTMLTAG_443___8。將身分提供者與組織相關聯___HTMLTAG_444__HTMLTAG_445
每個組織都可以擁有自己的 身分提供者,允許成員透過其組織的 IdP 登入(例如,Acme Corp 使用 Google Workspace,Beta Inc 使用 Okta)。
HTMLTAG_450__HTMLTAG_451___8.1 將 IdP 與組織關聯___HTMLTAG_452__HTMLTAG_453
預編碼_8
HTMLTAG_454__HTMLTAG_455___8.2 工作原理__HTMLTAG_456__HTMLTAG_457
- 使用者在登入頁面輸入電子郵件(身分優先登入)
- Keycloak 確定電子郵件網域 → 找到對應的組織
- 如果組織有連結的 IdP → 將使用者重新導向到該組織的 IdP
- 使用者使用組織的 IdP 進行驗證
- Keycloak 接收回應並自動將使用者附加到組織
HTMLTAG_470__HTMLTAG_471___9。身分優先登入___HTMLTAG_472__HTMLTAG_473
身分優先登入是使用者 先輸入電子郵件,然後 Keycloak 根據組織成員資格決定適當的驗證方法的流程。
HTMLTAG_478__HTMLTAG_479___9.1 設定身分優先登入___HTMLTAG_480__HTMLTAG_481
啟用組織後,Keycloak 會自動建立流 「組織」 用於瀏覽器驗證。此流程的工作原理如下:
預編碼_9
HTMLTAG_486__HTMLTAG_487___9.2 設定組織的現有流程___HTMLTAG_488__HTMLTAG_489
預編碼_10
HTMLTAG_490__HTMLTAG_491___10。將組織宣告對應到令牌___HTMLTAG_492__HTMLTAG_493
Keycloak 可以新增 組織資訊來存取令牌和 ID 令牌__HTMLTAG_496___,允許應用程式知道使用者屬於哪個組織。
___HTMLTAG_498__HTMLTAG_499___10.1 組織成員映射器___HTMLTAG_500__HTMLTAG_501___
啟用組織功能後,
Keycloak 會自動新增 organization 聲明。聲明格式:
{
"sub": "user-uuid",
"email": "[email protected]",
"organization": {
"acme-corporation": {
"name": "Acme Corporation",
"roles": ["member"]
}
},
"iss": "http://localhost:8080/realms/my-realm",
"aud": "my-app"
}
HTMLTAG_506__HTMLTAG_507___10.2 自訂映射器設定___HTMLTAG_508__HTMLTAG_509
您可以將 組織成員協定映射器 新增至客戶端範圍以自訂宣告:
# Thêm Organization Membership Mapper vào client scope
kcadm.sh create clients/${CLIENT_ID}/protocol-mappers/models -r my-realm \
-s name="organization-membership" \
-s protocol=openid-connect \
-s protocolMapper=oidc-organization-membership-mapper \
-s 'config."claim.name"=organization' \
-s 'config."id.token.claim"=true' \
-s 'config."access.token.claim"=true' \
-s 'config."userinfo.token.claim"=true'
HTMLTAG_514__HTMLTAG_515___10.3 在申請中使用聲明___HTMLTAG_516__HTMLTAG_517
// Ví dụ: Express.js middleware kiểm tra organization
import { Request, Response, NextFunction } from 'express';
interface OrganizationClaim {
[alias: string]: {
name: string;
roles: string[];
};
}
function requireOrganization(orgAlias: string) {
return (req: Request, res: Response, next: NextFunction) => {
const token = req.user; // decoded JWT
const orgs: OrganizationClaim = token.organization || {};
if (!orgs[orgAlias]) {
return res.status(403).json({
error: `User is not a member of organization: ${orgAlias}`
});
}
// Attach org info to request
req.organization = orgs[orgAlias];
next();
};
}
// Usage
app.get('/api/dashboard',
requireOrganization('acme-corporation'),
(req, res) => {
res.json({ message: `Welcome to ${req.organization.name}` });
}
);
HTMLTAG_518__HTMLTAG_519___11。 B2B 和 B2B2C 用例___HTMLTAG_520__HTMLTAG_521
HTMLTAG_522__HTMLTAG_523___11.1 B2B 合作夥伴入口網站___HTMLTAG_524__HTMLTAG_525
Scenario: Platform cung cấp portal cho partners
Realm: platform-realm
├── Organization: "Partner A" (partner-a.com)
│ ├── IdP: Partner A's Okta
│ ├── Members: 50 employees
│ └── Attributes: { plan: "gold", api_quota: "10000" }
├── Organization: "Partner B" (partner-b.com)
│ ├── IdP: Partner B's Azure AD
│ ├── Members: 200 employees
│ └── Attributes: { plan: "platinum", api_quota: "unlimited" }
└── Organization: "Partner C" (partner-c.com)
├── IdP: Partner C's Google Workspace
├── Members: 30 employees
└── Attributes: { plan: "silver", api_quota: "5000" }
Flow:
1. Partner employee truy cập portal
2. Nhập email → Keycloak detect organization từ domain
3. Redirect đến IdP của partner
4. Authenticate → token chứa organization claim
5. Application phân quyền dựa trên organization + plan
HTMLTAG_526__HTMLTAG_527___11.2 B2B2C SaaS 平台___HTMLTAG_528__HTMLTAG_529
Scenario: SaaS platform bán cho businesses, businesses mời end-users
Realm: saas-realm
├── Organization: "School A"
│ ├── Domain: school-a.edu.vn
│ ├── Members (Managed): Teachers, Admin staff
│ ├── Members (Unmanaged): Students (self-registered)
│ └── IdP: School A's LDAP → federated via Keycloak IdP
├── Organization: "School B"
│ ├── Domain: school-b.edu.vn
│ ├── Members (Managed): Teachers
│ └── Members (Unmanaged): Students
└── Individual users (no organization)
└── Free tier users
HTMLTAG_530__HTMLTAG_531___12。最佳實務___HTMLTAG_532__HTMLTAG_533
___HTMLTAG_535__HTMLTAG_536___使用組織而不是多領域 — 減少管理開銷,共享配置
___HTMLTAG_539__HTMLTAG_540___驗證網域 — 在自動指派使用者之前確保組織實際擁有該網域
___HTMLTAG_543__HTMLTAG_544___託管/非託管差異 — 為需要生命週期管理的員工託管,為外部使用者託管__HTMLTAG_546___
___HTMLTAG_547__HTMLTAG_548___使用身分識別優先登入 — 當多個組織具有不同的 IdP 時,可提供更好的使用者體驗
___HTMLTAG_551__HTMLTAG_552___安全邀請連結 — 設定合理的過期時間,監控待處理的邀請
___HTMLTAG_555__HTMLTAG_556___授權的組織屬性 — 使用屬性依計畫、層級、區域分散權限
___HTMLTAG_559__HTMLTAG_560___監控成員計數 — 在組織超出配額時設定警報