同期可能なスコープ

現段階では

  • 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