私たちの製品はクライアント サーバー アーキテクチャ上に構築されており、サーバーは Java で実装されています (Spring フレームワークで POJO を使用しています)。サーバーには 2 つの API レベルがあります。
- REST Web サービスを使用する外部 API - 外部クライアントおよび他のサーバーとの統合に役立ちます。
- 純粋な Java クラスを使用する内部 APIは、内部の実際のコード (ビジネス ロジックが API 呼び出しを何度も呼び出すため) や、社内外で開発され、製品の一部として展開されたプラスインとの統合に役立ちます。外部 REST API も内部 API を使用します。
最下位の API レベルでアクセスを制御したかったため、内部 API にアクセス許可チェック (Spring セキュリティを使用) を実装しました。
しかし、ここで問題が発生します。API レベルで定義されているいくつかの操作は、現在ログインしているユーザーに対して禁止されていると見なされますが、サーバー自体によってスムーズに実行される必要があります。たとえば、一部のエンティティの削除はユーザーに対して禁止されている可能性がありますが、サーバーは、ユーザーが実行した他の操作の副作用としてこのエンティティを削除したい場合があり、これを許可したいと考えています。
では、実際にログインしているユーザーには禁止されている可能性のある操作を (ある種のスーパーユーザー モードで) サーバーが実行できるようにする最善の方法は何でしょうか?
私が見ているように、いくつかのオプションがあり、それぞれに長所と短所があります。
- 外部レベル API (REST) でパーミッション チェックを実装します。プラグインがパーミッション チェックをバイパスするため、問題があります。
- リクエストが許可された後、現在のスレッドのパーミッション チェックを無効にします。危険すぎるため、禁止すべきサーバー アクションが多すぎる可能性があります。
- 特権モードで操作を実行するように内部 API レベルに明示的に要求します (Java セキュリティ フレームワークの PrivilegedAction と同様) - 冗長すぎます。
上記のアプローチはどれも理想的ではないため、この問題に対するベストプラクティスのアプローチは何ですか?
ありがとう。