#ejb #glassfish-3 #jaas
#ejb #glassfish-3 #jaas
Вопрос:
Этот код обычно выдает нам текущего зарегистрированного пользователя. Но когда метод запускается через таймер ejb, пользователя нет. Он должен возвращать значение null или исключение. Но я слышал от колледжей, что мы получаем еще одного случайного пользователя из контекста. Как это может произойти?
@Resource
private EJBContext ejbContext;
ejbContext.getCallerPrincipal().getName();
Есть ли у кого-нибудь опыт работы с этим кодом, запущенным с помощью таймера ejb?
Ответ №1:
Спецификация EJB 3.0 (и новее) гласит:
Контейнер EJB должен предоставлять доступ к информации контекста безопасности вызывающего объекта из экземпляров корпоративных компонентов с помощью методов
getCallerPrincipal()
иisCallerInRole(String roleName)
. Контейнер EJB должен предоставлять информацию о контексте безопасности вызывающего абонента во время выполнения бизнес-метода, вызываемого через интерфейс бизнес-компонента enterprise bean, home, component или messsage listener, конечную точку веб-службы и / илиTimedObject
интерфейс, как определено в таблице 1 на стр. 79, таблице 2 на стр. 88, Таблице 3 на стр. 117, таблице 4 на стр. 197 и таблице 10 на стр. 269. Контейнер должен гарантировать, что все вызовы метода корпоративного компонента, полученные через эти интерфейсы, связаны с некоторым принципалом. Если идентификатор безопасности вызывающего не был установлен, контейнер возвращает представление контейнера для не прошедшего проверку подлинности идентификатора. Контейнер никогда не должен возвращать значение null изgetCallerPrincipal
метода.
Поэтому в вашем конкретном случае я ожидал бы увидеть «представление контейнера не прошедшего проверку подлинности идентификатора». Если вы этого не видите, то я бы ожидал, что в вашем приложении отсутствует какая-либо конфигурация (возможно, через дескриптор развертывания, специфичный для GlassFish).