#java #spring #jakarta-ee #jboss #ejb
#java #spring #джакарта-ee #jboss #ejb
Вопрос:
Я переношу некоторые модули Java EE из Spring в EJB и теперь сталкиваюсь с проблемой, заключающейся в том, что мне нужна какая-то предварительная аутентификация перед вызовом метода service.
Проблема на самом деле довольно проста. Поступает вызов из внутреннего обработчика протокола (какой-то поток запустил собственный обработчик протокола и получил запросы, используя пользовательский протокол TCP). Не это соединение уже аутентифицировало пользователя и хочет вызвать метод обслуживания следующим. Для обработки этого метода обслуживания требуется основная информация (имя пользователя).
Итак, весной мы просто поместили SecurityContext в локальный поток и удалили его, когда вызов был выполнен.
Обработчик протокола -> Установить SecContext -> Вызов -> Удалить SexContext -> Конец
Есть ли что-нибудь подобное в Java EE / JBoss? Я знаю, что существуют конструкции «@RunAs», но я не знаю, можно ли их использовать программно. Или есть способ «войти в систему», используя класс JAAS LoginContext? Но как мне тогда настроить JAAS?
Ответ №1:
Если это просто вопрос получения идентификатора в контексте JAAS, вы должны быть в состоянии сделать что-то вроде этого:
final String username; // get this from somewhere
Princpal principal = new Principal() {
public String getName() {
return username;
}
};
Subject subject = new Subject(true, Collections.singleton(principal), Collections.emptySet(), Collections.emptySet());
Subject.doAs(subject, new PrivilegedAction<Void>() {
public Void run() {
// do your method call here
}
});
Обратите внимание, что вы можете вернуть значение из PrivilegedAction, привязав его к типу, отличному от Void, и выдать исключение, реализовав вместо этого PrivilegedExceptionAction .
Очевидно, что если у вас есть более сложное представление о том, что такое принципал, вы могли бы использовать это (реализация toString, hashCode и equals была бы хорошей идеей).