Как получить информацию о пользователе в сеансовом компоненте без сохранения состояния

Я работаю над существующим приложением j2ee, и мне необходимо удалить из кода некоторые вызовы методов, специфичных для поставщика.

Daos за фасадом сеанса делают вызовы в контейнер ejb, чтобы получить идентификатор пользователя и пароль - для подключения к базе данных. Идентификатор пользователя и пароль в InitialContext, используемые для подключения к серверу.

Я могу получить идентификатор пользователя, используя sessionContext.getCallerPrincipal()

Есть ли способ добраться до SECURITY_CREDENTIALS, используемого в соединении с сервером, или есть ли способ передать информацию из соединения с сервером в ejbs (все они являются сеансовыми компонентами без сохранения состояния).

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


person user42152    schedule 01.12.2008    source источник


Ответы (3)


Я не могу дать вам общее решение, но это то, что сработало для нас. У нас есть сервер приложений, подключающийся к LDAP как конкретный пользователь, который имеет возможность запрашивать учетные данные для других пользователей. Затем у нас есть некоторый общий код безопасности, который мы можем использовать для запроса учетных данных пользователей из сеансовых компонентов на основе идентификаторов пользователей из их первоначального входа в систему (точно так же, как вы делаете это через getCallerPrincipal()).

Мы также помещаем идентификатор пользователя в локальную переменную потока, так что классы, расположенные ниже по цепочке вызовов от EJB, не должны быть «осведомлены о контейнере». Они просто получают доступ к идентификатору из локального потока и используют классы безопасности для поиска информации профиля пользователя. Это также упрощает изменение реализации для тестирования или даже чего-то другого, кроме поиска LDAP.

Другими удобствами, которые мы создали, были JDBCServiceLocator, которые извлекают соединения с пользователем/паролем для текущего пользователя. Таким образом, разработчику вообще не нужно явно кодировать поиск безопасности.

person Robin    schedule 01.12.2008

Обычно модель безопасности Java EE не позволяет извлекать пароль пользователя из соображений безопасности. Но это зависит от реализации. Некоторые поставщики предоставляют методы для получения такого рода информации, но если вы полагаетесь на такие реализации, имейте в виду, что переносимость приложения будет скомпрометирована.

Одним из распространенных подходов является написание фильтра сервлета для перехвата запроса на вход и сохранения копии учетных данных для последующего использования. Если ваше приложение не использует инфраструктуру безопасности Java EE, это можно легко реализовать. Это связано с тем, что некоторые поставщики запрещают вам фильтровать сервлет аутентификации.

person Douglas    schedule 01.12.2008

Робин,

Похоже на то, что я планировал. Я решил, что позвоню сразу после успешного подключения к серверу, чтобы загрузить учетные данные в переменную threadLocal в моем классе подключения. Я надеялся, что есть более простой способ, но, похоже, нет.

person user42152    schedule 01.12.2008