Как предполагает ответ Майка Брауна, это невозможно в соответствии со спецификациями 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...).
person
Riduidel
schedule
18.10.2012