Как получить имя пользователя приложения JSF из сессионного компонента без сохранения состояния - PullRequest
1 голос
/ 04 августа 2010

в нашем приложении мы используем JSF & EJB 3.0 (EclipseLink 2.0). Нам нужно использовать авторизацию Oracle proxy для каждого соединения в наших сеансовых компонентах без сохранения состояния. Для этого нам нужно получить имя пользователя БД для подключения через прокси. Имя пользователя БД создается из имени пользователя, прошедшего аутентификацию JSF, по правилу.

Вот статья по теме http://blogs.oracle.com/olaf/2010/04/using_oracle_proxy_authenticat.html

Таким образом, когда аутентифицированный пользователь вызывает метод управляемого JSF-компонента, который в свою очередь вызывает некоторый метод сессионного компонента, его имя пользователя должно быть каким-то образом передано сессионному компоненту.

Сейчас у меня есть два не очень хороших решения: - передавать имя пользователя в качестве параметра в каждом методе сессионного компонента (не очень аккуратно, но будет работать); - решение из статьи выше: использовать переменную-член класса сессионного компонента для хранения имени пользователя (не потокобезопасно и потенциально опасно)

P.S. Я нашел решение, которое использует локальные переменные потока: _ http://www.adam -bien.com / roller / abien / entry / how_to_pass_context_with Работает нормально, но есть еще проблема. Мне нужно помещать текущее имя пользователя в каждый управляемый компонент сеанса jsf перед каждым вызовом компонента сеанса ejb, поскольку он должен находиться в одном потоке.

1 Ответ

2 голосов
/ 04 августа 2010

Если ваши пользователи аутентифицируются в контейнере, вы можете получить доступ к имени пользователя в ejb, используя внедренный экземпляр javax.ejb.SessionContext, например:

@Resource
private SessionContext context;

private String getCurrentUsername() {
    return context.getCallerPrincipal().getName();
}

Редактировать: Этоработает, если аутентификация настроена в web.xml через элементы login-config и security-constraint.Если вы выполняете аутентификацию самостоятельно, вы можете использовать ServletFilter и HttpServletRequestWrapper, которые переопределяют getUserPrincipal, getRemoteUser и isUserInRole (протестировано в glassfish).

Если вы обрабатываете аутентификацию в бине jsf, то это, вероятно, не будет работать,поскольку ejb уже будет инициализирован и введен.Однако вы также можете создать ejb в области сеанса, который просто содержит имя пользователя и внедрить этот bean-компонент в bean-компоненты без сохранения состояния.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...