同期可能なスコープ
現段階では
- LDAP グループの直接同期
- Keycloak に読み込まれた LDAP グループの同期
- Keycloak で直接作成されたグループももちろん同期可能
の二つが可能。 また、「GROWI <- 外部アプリ/サーバ」方向の同期のみが可能。
同期実行タイミング
キックオフ ではログイン時の自動同期と手動同期の案が上がっていたが、同期時に Keycloak がグループ一覧のリクエストに加えてグループに所属するメンバー一人一人の情報のリクエストを行う必要があり、グループ数/ユーザ数によっては重い処理となる可能性があるので、手動実行としたい
子グループメンバーの親グループへの所属をどうするか
GROWI の UserGroup の仕様
- ユーザ管理: 子グループに追加したユーザは自動的に親グループに追加される
- 権限継承:(権限を表す model は GROWI にはないが)子グループに属している = 親グループにも属しており、親グループの権限がある、という状態が実現されている
- 親グループから外されると子グループからも外される
LDAP グループの仕様
- ユーザ管理: 親グループに所属するユーザと子グループに所属するユーザは別々に管理される
- 権限継承: グループの木構造を表すだけで、LDAP 自体の機能としての親グループから子グループへの継承機能はない
- 木構造からどのように権限を設定するかは LDAP を使うアプリケーション側に委ねられている
Keycloak グループの仕様
- ユーザ管理: 親グループに所属するユーザと子グループに所属するユーザは別々に管理される
- UI 上で親グループのメンバー欄に子グループのメンバーを表示する機能はあるが、内部的にはそのメンバーは親グループに属していない
- 権限継承: グループには role という権限を表す値があり、子グループには親グループの role が継承される。
- (GROWI には role がないので)role は今試作では同期しないが、親から子へと継承するという思想は GROWI と同じ
結論
ImportedUserGroup は、UserGroup と同様に、子グループに属するユーザは親グループにも属する、という仕様にし、同期時にその状態を作るようにする。
- 理由: 各権限継承の考え方から見ても UserGroup の形に合わせるのは特に問題はなく、何より UserGroup と ImportedUserGroup を一緒に使った実装がしやすくなる。
- 仮に Keycloak の role のような概念が今後 GROWI に追加されたとすると、Keycloak 側に寄せるのか同じ構造のままにするのか考える余地がありそう。その時は UserGroup の構造も再検討するべきかと。
UI
外部グループ一覧表示
グループ管理の画面で、「グループ一覧」の下に「外部グループ一覧」を表示する。
- 新規作成: 不可
- 編集: description のみ可 (mapper を設定している場合、再同期で編集内容が上書きされる可能性あり)
- 削除: 可
グループ同期 UI
グループ管理の画面で、グループ同期を設定・発火する UI を表示する。
大規模グループ同期の検証結果
実行環境
- M1 macbook air
- docker に割り当てているリソース
- CPUs: 6
- Memory: 10GB
同期するデータ
- グループ 100 個
- グループツリー 10 個
- ツリーの階層 10
- 1グループ/階層
- ユーザ 10000 人
- 100 ユーザ/グループ
LDAP
GROWI を実行している開発環境で LDAP サーバを用意
実行時間
4:49.302 (m:ss.mmm)
メモリ使用
同期実行直前/実行中/実行直後のメモリ使用
2.795GiB / 9.718GiB 2.992GiB / 9.718GiB 3.375GiB / 9.718GiB 3.329GiB / 9.718GiB 3.681GiB / 9.718GiB 3.529GiB / 9.718GiB 3.337GiB / 9.718GiB 3.474GiB / 9.718GiB 3.478GiB / 9.718GiB 3.383GiB / 9.718GiB 3.699GiB / 9.718GiB 3.513GiB / 9.718GiB 3.403GiB / 9.718GiB 3.371GiB / 9.718GiB 3.421GiB / 9.718GiB 3.446GiB / 9.718GiB 3.616GiB / 9.718GiB 3.431GiB / 9.718GiB 3.431GiB / 9.718GiB 3.394GiB / 9.718GiB 3.418GiB / 9.718GiB 3.427GiB / 9.718GiB 3.374GiB / 9.718GiB 3.463GiB / 9.718GiB 3.453GiB / 9.718GiB 3.459GiB / 9.718GiB 3.508GiB / 9.718GiB 3.508GiB / 9.718GiB 2.738GiB / 9.718GiB 2.732GiB / 9.718GiB
Keycloak
GROWI を実行している開発環境で Keycloak サーバを用意。 Keycloak 側で LDAP サーバのグループを読み込む設定を行う。
実行時間
7:09.994 (m:ss.mmm)
同期実行時、Keycloak に LDAP グループ情報を読み込む処理が挟まるため、LDAP よりも実行時間が長い。
メモリ使用
同期実行直前/実行中/実行直後のメモリ使用
Memory Usage: 3.725GiB / 11.68GiB Memory Usage: 3.742GiB / 11.68GiB Memory Usage: 3.745GiB / 11.68GiB Memory Usage: 3.715GiB / 11.68GiB Memory Usage: 3.725GiB / 11.68GiB Memory Usage: 3.739GiB / 11.68GiB Memory Usage: 3.968GiB / 11.68GiB Memory Usage: 3.966GiB / 11.68GiB Memory Usage: 3.98GiB / 11.68GiB Memory Usage: 4.152GiB / 11.68GiB Memory Usage: 4.283GiB / 11.68GiB Memory Usage: 4.196GiB / 11.68GiB Memory Usage: 4.304GiB / 11.68GiB Memory Usage: 4.269GiB / 11.68GiB Memory Usage: 4.241GiB / 11.68GiB Memory Usage: 4.231GiB / 11.68GiB Memory Usage: 4.301GiB / 11.68GiB Memory Usage: 4.334GiB / 11.68GiB Memory Usage: 4.243GiB / 11.68GiB Memory Usage: 4.293GiB / 11.68GiB Memory Usage: 4.296GiB / 11.68GiB Memory Usage: 4.281GiB / 11.68GiB Memory Usage: 4.263GiB / 11.68GiB Memory Usage: 4.298GiB / 11.68GiB Memory Usage: 4.322GiB / 11.68GiB Memory Usage: 4.327GiB / 11.68GiB Memory Usage: 4.377GiB / 11.68GiB Memory Usage: 4.404GiB / 11.68GiB Memory Usage: 4.392GiB / 11.68GiB Memory Usage: 4.334GiB / 11.68GiB Memory Usage: 4.332GiB / 11.68GiB Memory Usage: 4.346GiB / 11.68GiB Memory Usage: 4.349GiB / 11.68GiB Memory Usage: 4.321GiB / 11.68GiB Memory Usage: 4.337GiB / 11.68GiB Memory Usage: 4.342GiB / 11.68GiB Memory Usage: 4.35GiB / 11.68GiB Memory Usage: 4.364GiB / 11.68GiB Memory Usage: 4.337GiB / 11.68GiB Memory Usage: 4.373GiB / 11.68GiB Memory Usage: 4.375GiB / 11.68GiB Memory Usage: 4.373GiB / 11.68GiB Memory Usage: 4.373GiB / 11.68GiB Memory Usage: 3.657GiB / 11.68GiB Memory Usage: 3.656GiB / 11.68GiB Memory Usage: 3.656GiB / 11.68GiB Memory Usage: 3.657GiB / 11.68GiB Memory Usage: 3.658GiB / 11.68GiB