用語に関する注意:
- ここでの認証メカニズム (AM)は、関連する認証ステートメントを作成し、その結果として、Java EE ランタイムを使用して/で認証された呼び出し元エンティティの ID を登録/確立する役割を担うコンポーネントを指します。このようなコンポーネントは、Application Server (AS) または Java EE 標準に固有のものである場合があります。Java EE アプリケーション開発者による拡張が予定されている AS 実装の詳細またはタイプ。Java EE アプリケーションの一部として、または AS の一部としてデプロイされます。そのようなコンポーネントの 1 つがJAAS
LoginModule
(LM) です。アイデンティティ ストア (IS)は、最近 (とりわけ) LM を参照するために使用される (半) 規範的な用語のように見えますが、アプリケーション固有の永続化レイヤー (JPA など) 用に予約したいと思いました。 @Entity
)ユーザーを表すタイプであるため、この(定義が不十分な)区別を確立する必要がありました。「なぜあいまいなのですか?」、「LM を LM と呼べないのですか?」と尋ねるかもしれません。JBoss LM について何も知らないからです。実際、私は JBoss ユーザーでも、Java EE で JAAS を使用している人でもありません。それでも、一般的なケースに適用される回答に貢献できると感じたため、避けられない曖昧さがあります。
- 非アクティブ化されたユーザーとは、より適切な用語がないため、「追い出されるユーザー」、つまり、権利 (グループ、ロール、パーミッションなど、そこで呼ばれるものは何でも) が取り消されたユーザーを指します。ある意味ISレベル。
まず第一に、任意のユーザーをコードに公開する標準の Java EE API はありませ
Subject
ん
HttpSession
。理論的には、認証中などにその情報を自分で記録することもできますが、これはあなたが望むものではないと思います。さらに、具体的には、 に代わって要求を処理する際に ( / 資格情報コレクションの) 変更を
Subject
明示的に禁止する標準はありませんが、いずれかで
なければならないと述べているものはありません。
実際には、現在の認証された呼び出し元(認証中に入力され、
JACCを介して取得できるもの)が
必要かどうかさえ明確ではありません。
Principal
Subject
Subject
"javax.security.auth.Subject.container"
PolicyContextHandler
Policy
承認の決定を行う際にランタイムが照会するデータ構造と一致します。つまり、ランタイムはコピーのみを提供するか、認証された呼び出し元のまったく異なる表現を内部で使用するか、またはその間の何かを使用する可能性があります。したがって、 を変更できたとしても
Subject
、実際のセキュリティ コンテキストに必ずしも影響するとは限りません。
できることを進めていきます。認証側および/または承認側のいずれかでニーズに対応できますが、前者のアプローチは後者よりも採用がはるかに簡単です。あなたは私のコメントに答えなかったので、考えられる答えの両方を簡単に説明します.
発信者再認証の禁止
アプリケーションがユーザーを非アクティブ化したら、AM が発行する後続の要求でユーザーの再認証を停止するように何らかの方法で AM に指示する必要があります。カップリングを減らすために、アプリケーションは通常 AM と直接通信しませんが、AM によって評価される条件を満たします。たとえば、アプリケーションは特別な「locked_out」権限をユーザーに割り当てたり、HttpSession
属性を設定したりします。非アクティブ化されたユーザーの再認証を求められると、AM は非アクティブ化を認め、再認証を拒否します。その後、ユーザーのセッションが無効になります。それがどの程度正確に達成されるかは、その種類と実装によって異なります。あなたの LM はおそらく、その目的のために"javax.servlet.http.HttpServletRequest"
JACCを活用しなければならないでしょう。PolicyContextHandler
ジャスピック ServerAuthModule
validateRequest
引数として受け取ったリクエストインスタンスにすぐにアクセスできます。他のコンポーネントは、おそらく AS 内部の使用に頼る必要があるか、アプリケーションにセッション無効化の責任を負わせる必要があります ( Servlet Filter
などの一部の呼び出し傍受コンポーネントは、IS にもう一度クエリを実行し、それに応じて動作する必要があります)。
前述のアプローチでは、明らかに AM の機能を変更する機能が必要です。さらに、キャッシュ AM は、以前に確立された認証結果を再利用する前に、前述の非アクティブ化条件を評価する必要があります。最後に、コメントで述べたように、ユーザーの IS アクセス失効時に、そのユーザーに代わって要求が処理されている (アクセス失効イベントが発生する前に到着した/認証された) 場合、そのリクエストのサービスは正常にHttpServletRequest#
完了します(アプリケーションが(login
| )などを介してそのユーザーの再認証をリクエストしない限りauthenticate
)。
発信者再認証の禁止
冒頭で述べたように、ユーザーのSubject
s は簡単に取得/変更できませんがPolicy
、JACC 準拠の Java EE ランタイムでそれらが承認される裏付けは、実際には. 残念ながら、デフォルトの AS 提供の JACC プロバイダー ( PolicyConfiguration
+ Policy
) には重大な制限があります。それは、Java EEロールに対してのみ操作を許可し、 にマップされた(つまり、これらのロールを「持つ」)呼び出し元に対して操作を許可しませんPrincipal
。たとえば、デフォルト プロバイダを使用すると、「admin」ロールにマップされたs が持つ を拡張できます。「admin」ロールとそのすべてのロールを削除できます。しかし、それはあなたが誰を決定することを許可しませんPermission
Principal
Permission
「管理者」になります--少なくとも標準的な方法ではありません。
この制限により、JACC に関する限り、基本的に 2 つの選択肢が残されます。AM に、それぞれのcaller と同じ名前の「ダミー」グループ Principal
を各 caller に追加させる。次に、ユーザーの非アクティブ化時に、「ダミー」グループに関連するカスタムを ( 経由で)追加します。最後に、「application-space」コードから (たとえば、AccessController#checkPermission を介して) ユーザーが を持っているかどうかを確認し、持っている場合はそれらを追い出します。しかし、待ってください、これはまったく無意味です。それ自体で承認を処理できないのに、なぜそもそも をわざわざ使用する必要があるのでしょうか。別の方法は、独自の JACC プロバイダーを作成してインストールすることです。そうすることで、完全に制御できるようになりますSubject
Principal
PolicyConfiguration#addToRole
Permission
Permission
Policy
Principal
-/グループからロールへのマッピングと、その時点からのその情報を使用して、承認に関して、ほとんど好きなように行動できるようにします。ただし、新しいプロバイダーを作成することは簡単ではありません。特に、単一のアプリケーションの範囲内だけでなく、JRE 全体の承認ニーズに対応する必要があるためです。あなたの要件が、それほど高い作業量を正当化するとは思えません。それでもその道をたどりたい場合は、Arjan Tijms のブログにある JACC 関連の記事が出発点として最適です。