コード内の任意の位置で JAAS ロールにアクセスするにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/528938

質問

SOAP アプリ内のロールを持つユーザーの完全なモデルにアクセスしたいと考えています。たとえば、「Fred」というユーザーの役割を知りたいとします。

ある種のグローバル JAAS レジストリにアクセスして実行するにはどうすればよいですか (疑似コード) globalRegistry.getUser("フレッド").getPrincipals()?(JAAS では、ロールは 主要.)

の入手方法は知っています 主要主題 から ログインコンテキスト, しかし、それには2つの問題があります。

  1. これはログイン時のみであり、前述のレジストリをコーディングして保存することは避けたいと考えています。 主題 そして 主要 オブジェクトはすでにアプリサーバーに保存されているため、自分自身で作成します。
  2. できれば、Fred が現在のユーザーでない場合でも、この情報にアクセスできるようにしたいと考えています。

私は Jetty を使用していますが、これらの動作は JAAS の標準であると思われます。

役に立ちましたか?

解決

我々は、システムのエントリポイント(この場合、サーブレットまたはEJB)で認証されているように、現在のユーザーを参照するためにThreadLocal変数を使用します。これは、現在のユーザーに対して「グローバル」アクセスを可能にします。これは直接JAASや他のセキュリティプロトコルに縛られていないが、それらから初期化することができます。

編集:のThreadLocalからの戻り現在のユーザの対象である

他のユーザーへのアクセスは、通常、管理モジュールのいくつかのタイプを介して行われます。

他のヒント

私が見てきたパターンがあります:

AccessControlContext acc = AccessController.getContext();
Subject subject = Subject.getSubject(acc);
Set<Principal> principals = subject.getPrincipals();

本質的に、これは現在、現在のスレッドに関連付けられている被写体を見つけ、そのプリンシパルを求めます。

このの使用の一例は、のApache Jackrabbitののの<のhref = "HTTPであります:/ /svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java?view=markup」のrel = "noreferrer"> RepositoryImplする 。それは、その仕事に新しいセッションを(と思う)の作成時に、現在のスレッドが持っているものJackrabbitの権利を決定することであるextendAuthentication方法、であります。

しかし、私は、これは必ずしも実際に、少なくともJ2EEコンテキストでは、動作しない可能性があることに注意すべきです。私は、JBoss AS7の下で、このコードを使用していて、それは対象を見つけることができません。それはちょうどしかし、バグかもしれません。

私には、これが appsever のユーザーやグループなどを混乱させているように思えます。J2EE アプリケーション ロールを使用します。

  • 特定のユーザーの権限の取得は管理タスクであり、通常はアプリサーバー固有の API を使用して実行する必要があります。
  • JAAS プログラミング モデルは、より高いレベルの抽象化で動作します。ユーザーが J2EE ロール (アプリケーション内で定義) に属しているかどうかの情報のみが提供されます。

私は、JAASは本当にあなたがやろうとしているものを許可しないように設計されていたと信じています。私はサイドステップのためにJAASやプログラムを直接実際のアイデンティティリポジトリだったものは何でも、それはLDAP、ActiveDirectoryのか、何も持っていた機能の並べ替えを必要とすることを私が構築したアプリケーションで知っています。

EJBの使用では

@Resource(mappedName = "java:comp/EJBContext")
protected SessionContext sessionContext;

そして、任意の時点で)context.lookup("java:comp/EJBContext"てみてください。

<時間> 他の人がそれを見つけるために彼らのJNDIに見えるために

このコードでは、JBossサーバーファミリ用です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top