Пользователь с предварительной аутентификацией в Java EE / JBoss КАК 6

#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 была бы хорошей идеей).