3

一部の操作が MDB によって実行されるアプリケーションがあります。これらの MDB はすべて、@RunAs(SYSTEM)アノテーションを使用してそれらをシステム要素としてマークします。

これらの MDB の 1 つは@RolesAllowed(WORKSPACE)、 を介して保護されたコードを実行する必要があります。これはSYSTEM明らかに役割にはありませんがuser、プロセスを開始した (人間、気をつけてください) にはあります。

userしたがって、私の質問は非常に単純です。たとえば、非同期呼び出しを使用して、MDB のプリンシパルをではなくmy に変更する方法はありSYSTEMますか?

4

3 に答える 3

2

Mike Braunの回答が示唆するように、これはJavaEE仕様では不可能です。

そして、それは残念です。しかし、少し残念なことに、そのアプリケーション サーバーの@RunAs. Glassfish では、その特定のコードはcom.sun.enterprise.security.auth.login.LoginContextDriverクラス、特にそのLoginContextDriver#loginPrincipalメソッドにあります。

したがって、特定のプリンシパルを使用するコードの一部を作成するために、インターフェイスを定義しました

public interface Sudoer {
    public <Result> Result sudo(String user, SudoOperation<Result> operation);
}

Glassfishに実装したもの:

public class GlassfishSudoer implements Sudoer {
    @Override
    public <Result> Result sudo(String user, SudoOperation<Result> operation) {
        try {
            LoginContextDriver.loginPrincipal(user, "autocat");
            return operation.perform();
        } catch (Exception e) {
            throw new UnableToSudoException(e);
        } finally {
            LoginContextDriver.logout();
        }
    }
}

そして、それを使用する場合、コードを「sudoed」したい部分は、次のように SudoOperation の実装を提供するだけで済みます

    component.sudo(userLogin, new SudoOperation<Void>() {
        public Void perform() {
            /* do some sudoed code */
            return null;
        }
    });

この方法の利点は、指定されたアプリケーション サーバーに処理する@RunAsコードがある場合、そのコードを使用して独自の sudoer を実装できることです (それを sudo-ejb ライブラリに抽出することを考えています ...)。

于 2012-10-18T12:30:21.730 に答える
2

SYSTEMは役割だと思いますが、ユーザーとは、たとえば JMS メッセージを送信して MDB がリッスンしているキューを伝えるユーザーを意味しますか?

そのユーザーとして正確なロールを持つプリンシパルを設定したい場合 (基本的に、ユーザーのセキュリティ コンテキストを伝播するか、MDB 内からコンテナー ログインを実行します)、残念ながらこれは不可能です。EJB でコンテナー ログインを標準化する要求があります (EJB 仕様 JIRA を参照)。

これに対する回避策は、サーブレット API を使用して特定のユーザーのログインをトリガーできる JAX-RS リソースである可能性があります。ここでは、ギャップのあるセキュリティ リークを作成しないように注意する必要があります (たとえば、ユーザー名のみによるログインを許可するなど)。ただし、それはオプションです。

ロールWORKSPACEだけが必要な場合は、単に 2 番目の @RunAs を使用できませんか?

于 2012-10-18T10:49:23.637 に答える
0

見てください: 最近の質問はこちら

より一般的なアプローチです。私のためにJBossで働いています。

于 2012-11-09T07:32:26.230 に答える