callerPrincipal не должен давать результата при запуске по таймеру ejb

#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).