2011-10-14 3 views
0

Я переношу некоторые модули Java EE из Spring в EJB и теперь сталкивается с проблемой, что перед вызовом метода службы мне нужна какая-то предварительная аутентификация.Предварительно аутентифицированный пользователь в Java EE/JBoss AS 6

Проблема на самом деле довольно проста. Вызов поступает от внутреннего обработчика протокола (какой-то поток запускает собственный обработчик протокола и принимает запросы с использованием пользовательского протокола TCP). Не это соединение уже аутентифицировало пользователя и хочет вызвать следующий метод службы. Для этого метода услуги требуется основная информация (имя пользователя) для обработки.

Так что весной мы просто нажали SecurityContext на локальный поток и удалили его, когда вызов был выполнен.

Протокол Handler -> Set SecContext -> Вызов -> Удалить SexContext -> End

Есть ли что-то подобное тому, что в 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 была бы хорошей идеей).

Смежные вопросы