2010-08-04 1 views
1

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

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

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

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

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

ответ

2

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

@Resource 
private SessionContext context; 

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

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

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

+0

Большое спасибо, Йорн. Ваше решение кажется мне очень аккуратным. P.S. Можете ли вы сказать мне, когда SessionContext не будет содержать имя текущего веб-уровня? – Andrey

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