2016-10-20 3 views
0

Этот код обычно дает нам в настоящее время вошедший в систему пользователя. Но когда метод запускается через таймер ejb, пользователя нет. Он должен вернуть null или исключение. Но я слышал из колледжей, что мы получаем другого случайного пользователя из контекста. Как это может произойти?callerPrincipal не должен давать результата при запуске с помощью таймера ejb

@Resource 
private EJBContext ejbContext; 

ejbContext.getCallerPrincipal().getName(); 

Есть ли у кого-нибудь опыт работы с этим кодом, запущенным через таймер ejb?

ответ

0

EJB-3,0 спецификация (и новее) говорит:

Контейнер EJB должен обеспечить доступ к контекст безопасности информации о вызывающем абоненте из экземпляров корпоративных бинов через getCallerPrincipal() и isCallerInRole(String roleName) методов. Контейнер EJB должен предоставлять информацию контекста безопасности вызывающего абонента во время выполнения бизнес-метода, вызванного через предприятие интерфейс бизнес-пользователя, дома, компонента или messsage bean, веб-терминал и/или интерфейс TimedObject, как определено в Таблица 1 на стр. 79, Таблица 2 на стр. 88, Таблица 3 на стр. 117, Таблица 4 на стр. 197 и Таблица 10 на стр. 269. Контейнер должен гарантировать, что все вызовы метода бизнес-компонента , полученные через эти интерфейсы , являются связанных с некоторыми принципалами. Если идентификатор безопасности вызывающего абонента не был установлен, контейнер возвращает представление контейнера не прошедшего проверку подлинности. Контейнер должен никогда не возвращать null из метода getCallerPrincipal.

Поэтому в вашем конкретном случае я ожидаю увидеть «представление контейнера не прошедшего проверку подлинности личности». Если вы не видите этого, я бы ожидал, что в вашем приложении отсутствует какая-либо конфигурация (возможно, с помощью дескриптора развертывания GlassFish).

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