なりすまし
なりすましは、権限を持つユーザーがほかのユーザーとして振る舞う仕組みです。その人に何が見えているのかを再現したり、その人の代わりに何かを実行したりするために使います。なりすまし中のリクエストはすべてなりすまし先のユーザーに帰属し、なりすましのセッションはすべて記録されます。開始するには admin(または super_admin)が必要です。
誰が誰になりすませるか
| 操作者 \ 対象 | super_admin を持つ | admin を持つ | それ以外のユーザー |
|---|---|---|---|
| スーパー管理者 | ❌ | ✅ プラットフォーム全体 | ✅ プラットフォーム全体 |
| 管理者 | ❌ | ❌ | ✅ 自テナントのみ |
| それ以外のロール | ❌ | ❌ | ❌ — 操作自体が出ません |
この表の形にこそ意味があります。なりすましを使って、操作者がまだ持っていない権限を得ることはできません。通常の管理者は同格の管理者になりすませませんし、スーパー管理者が管理者になりすましても何も増えません。管理者が通るゲートはすでにすべて素通りしているからです。
対象側は実効ロールで判定します。ユーザーグループから継承した admin も、直接付与されたものとまったく同じように持ち主を守ります。そうでなければ、グループが上の表を迂回する抜け道になってしまいます。
ロールとは関係なく拒否される対象がほかに 4 つあります。自分自身、初期投入されるシステムユーザー、無効化されたユーザー、論理削除されたユーザーです。また管理者から見て他テナントの対象は、403 ではなく HTTP 404 で返ります。テナントをまたいだ参照が、そのユーザーの実在を裏づけることはありません。
開始と停止
開始はユーザー一覧のなりすまし操作からです。確認すると、そのユーザーとしてウェルカムページに着きます。実行中はヘッダーに「Acting as <user>」のチップが出て、ワンクリックで停止できます。
同時に開けるなりすましは 1 つだけです。新しく始めると、開いていたものは閉じます。停止はいつ呼んでも安全で、何も開いていなくてもエラーにはなりません。
実効的な身元
なりすましはセッションの差し替えではなく、リクエストヘッダーによる上書きです。実際のセッションクッキーは変わりません。ブラウザは選んだユーザーの ID を各リクエストに付けるだけで、バックエンドはそこから実効的な身元を解決します。ここから 2 つのことが導かれます。
- 実際の操作者のセッションは下でそのまま生きているので、停止するときに再度サインインする必要はありません。
- リクエストが触れるものはすべて、読み取りも書き込みも、監査用の
createdByとupdatedByフィールドも、なりすまし先のユーザーに帰属します。そのユーザー自身がサインインしている場合とまったく同じです。ロールのチェックもなりすまし先の実効ロールに対して行われます。スーパー管理者が申請者として振る舞えば、申請者のゲートで判定され、申請者が見る UI が見えます。
開始と停止のエンドポイントだけは意図的な例外で、実効的な身元ではなく実際の操作者のロールで判定します。そうしないと、あえて権限のないユーザーになりすました管理者が、自分の「停止」の呼び出しでロールチェックに落ちて、そこから抜け出せなくなります。
なりすましが無効になるとき
適格かどうかは、開始時だけでなく毎リクエスト再検証されます。上の表はロールに依存していて、ロールは動くからです。なりすましが成立しなくなったとき、リクエストは失敗しません。静かに実際の操作者に戻り、古い記録を閉じます。対象が無効化・削除された場合、対象が昇格した場合(admin を付与するグループに入れられた場合を含みます)、操作者が admin(直接の付与でも、付与するグループからの脱退でも)や super_admin を失った場合、操作者が対象と同じテナントでなくなった場合、別の場所で停止された場合が、これにあたります。
代わりにリクエストを失敗させると、役に立たないどころか害になります。選択はブラウザのローカルストレージにあるので、エラーにしてしまうと、古い値 1 つで正当な管理者がアプリケーション全体から締め出されかねません。
監査証跡
なりすましのセッションは、誰が誰にいつ、という形で impersonation_events テーブルに永続的に記録されます(設定リファレンスを参照)。createdBy と updatedBy に入るのはなりすまし先のユーザーなので、「その書き込みの後ろにいたのは実際には誰か」に答えられるのはこの証跡だけです。だからこれは省略可能な機能ではありません。
Admin はこの証跡を監査ログの Impersonations タブで読めます。自テナントのアカウントが関わったセッションが、Super Admin が開始したものも含めてすべて並びます。