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 ライブラリに抽出することを考えています ...)。