4

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

ある種のグローバル JAAS レジストリにアクセスして (疑似コード) globalRegistry.getUser("Fred").getPrincipals()を実行するにはどうすればよいですか? (JAAS では、役割はPrincipalによって表されることに注意してください。)

LoginContextからサブジェクトのプリンシパルを 取得する方法は知っていますが、これには 2 つの問題があります。

  1. これはログイン時のみであり、前述のレジストリをコーディングしてSubjectオブジェクトとPrincipalオブジェクトを自分で保存することは避けたいと思います。それらは既に appserver によって保存されているからです。
  2. できれば、Fred が現在のユーザーでなくても、この情報にアクセスできるようにしたいと考えています。

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

4

5 に答える 5

5

私が見たパターンは次のとおりです。

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

基本的に、これは現在のスレッドに現在関連付けられているサブジェクトを見つけ、そのプリンシパルを要求します。

これの使用例の 1 つは、Apache JackrabbitRepositoryImplにあります。それextendAuthenticationは、新しいセッションを作成するときに現在のスレッドが持っている Jackrabbit の権利を決定することを仕事とするメソッドにあります (私は思います)。

ただし、少なくとも J2EE コンテキストでは、これが必ずしも実際に機能するとは限らないことに注意してください。JBoss AS7 でこのコードを使用していますが、サブジェクトが見つかりません。ただし、それは単なるバグかもしれません。

于 2012-01-06T23:31:31.677 に答える
3

ThreadLocal 変数を使用して、システム エントリポイント (この場合はサーブレットまたは ejb) で認証された現在のユーザーを参照します。これにより、現在のユーザーへの「グローバル」アクセスが許可されます。これは、JAAS やその他のセキュリティ プロトコルに直接関連付けられているわけではありませんが、JAAS から初期化できます。

編集: ThreadLocal からの戻り値は、現在のユーザーのサブジェクトです。

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

于 2009-02-09T17:35:18.493 に答える
1

JAAS は、あなたがやろうとしていることを実際には許可しないように設計されていると思います。私が構築したアプリでは、JAAS を回避し、LDAP や ActiveDirectory など、実際の ID リポジトリが何であれ、直接プログラムする必要がある機能が必要であることがわかっています。

于 2010-05-25T14:34:22.120 に答える
0

EJB での使用

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

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


このコードは JBoss サーバー ファミリー用で、他のユーザーは JNDI を参照して見つけます。

于 2014-03-07T10:06:07.093 に答える