После поиска в Интернете и попыток различных способов, вот что я бы предложил для аутентификации Java EE 6:
Настройте область безопасности:
В моем случае, у меня были пользователи в базе данных. Поэтому я последовал за этой записью в блоге, чтобы создать JDBC Realm, который мог бы аутентифицировать пользователей на основе имени пользователя и паролей, хэшированных в MD5, в моей таблице базы данных:
http://blog.gamatam.com/2009/11/jdbc-realm-setup-with-glassfish-v3.html
Примечание: пост рассказывает о пользователе и групповой таблице в базе данных. У меня был класс User с атрибутом перечисления UserType, сопоставленный посредством аннотаций javax.persistence в базу данных. Я настроил область с той же таблицей для пользователей и групп, используя столбец userType в качестве столбца группы, и он работал нормально.
Использовать аутентификацию формы:
Следуя приведенному выше сообщению в блоге, настройте свои web.xml и sun-web.xml, но вместо использования BASIC-аутентификации используйте FORM (на самом деле, не имеет значения, какой вы используете, но в итоге я использовал FORM). Используйте стандартный HTML, а не JSF.
Затем используйте подсказку BalusC выше о ленивой инициализации пользовательской информации из базы данных. Он предложил делать это в управляемом компоненте, получая основную часть из контекста лиц. Вместо этого я использовал сессионный компонент с сохранением состояния для хранения информации о сеансе для каждого пользователя, поэтому я ввел контекст сеанса:
@Resource
private SessionContext sessionContext;
С принципалом я могу проверить имя пользователя и, используя EJB Entity Manager, получить информацию о пользователе из базы данных и сохранить ее в моем SessionInformation
EJB.
Выйти:
Я также искал лучший способ выхода из системы. Лучший из найденных мной - это использование сервлета:
@WebServlet(name = "LogoutServlet", urlPatterns = {"/logout"})
public class LogoutServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession(false);
// Destroys the session for this user.
if (session != null)
session.invalidate();
// Redirects back to the initial page.
response.sendRedirect(request.getContextPath());
}
}
Хотя мой ответ действительно опаздывает с учетом даты вопроса, я надеюсь, что это поможет другим людям, которые попадают сюда из Google, так же, как и я.
Чао,
Вит Суза
HttpServletResponse#login(user, password)
, таким образом, вы можете просто получить из БД соль пользователя, итерации и все, что вы используете для посола, хешировать пароль, введенный пользователем с помощью этой соли, а затем попросить контейнер аутентифицироваться с помощьюHttpServletResponse#login(user, password)
,Я полагаю, вы хотите аутентификацию на основе форм с использованием дескрипторов развертывания и
j_security_check
.Вы также можете сделать это в JSF, просто используя те же predefinied имена полей
j_username
и ,j_password
как показано в руководстве.Например
Вы можете выполнить ленивую загрузку в
User
получателе, чтобы проверить,User
вошел ли уже в систему, и если нет, то проверитьPrincipal
, присутствует ли в запросе, и если да, то получитьUser
связанный сj_username
.User
, Очевидно , доступен в JSF EL на#{auth.user}
.Для выхода сделайте
HttpServletRequest#logout()
(и установитеUser
в ноль!). Вы можете получить ручкуHttpServletRequest
в JSFExternalContext#getRequest()
. Вы также можете просто полностью аннулировать сеанс.Для остатка (определение пользователей, ролей и ограничений в дескрипторе и области развертывания) просто следуйте учебному руководству по Java EE 6 и документации по сервлет-контейнеру обычным способом.
Обновление : вы также можете использовать новый Servlet 3.0
HttpServletRequest#login()
для программного входа в систему вместо использования,j_security_check
которое само по себе может быть недоступно для диспетчера в некоторых контейнерах сервлетов. В этом случае вы можете использовать fullworthy формы JSF и боб сusername
иpassword
свойствами иlogin
способом , которые выглядят следующим образом :И это представление управляет управляемым бином, который также запоминает первоначально запрошенную страницу:
Этот способ
User
доступен в JSF EL#{user}
.источник
j_security_check
может не работать для всех контейнеров сервлетов.@WebServlet(name="testServlet", urlPatterns={"/ testServlet "}) @ServletSecurity(@HttpConstraint(rolesAllowed = {"testUser", "admin”}))
И для каждого метода уровень:@ServletSecurity(httpMethodConstraints={ @HttpMethodConstraint("GET"), @HttpMethodConstraint(value="POST", rolesAllowed={"testUser"})})
FacesServlet
и вы не можете (и не хотите) изменять его.RequestDispatcher.FORWARD_REQUEST_URI
. Атрибуты запроса в JSF доступныExternalContext#getRequestMap()
.Следует отметить, что это возможность полностью оставить проблемы аутентификации переднему контроллеру, например, веб-серверу Apache, и вместо этого оценить HttpServletRequest.getRemoteUser (), который является представлением JAVA для переменной среды REMOTE_USER. Это позволяет также сложные проекты входа в систему, такие как аутентификация Shibboleth. Фильтрация запросов к сервлет-контейнеру через веб-сервер - хороший дизайн для производственных сред, часто для этого используется mod_jk.
источник
Проблема HttpServletRequest.login не устанавливает состояние аутентификации в сеансе была исправлена в 3.0.1. Обновите Glassfish до последней версии, и все готово.
Обновление довольно просто:
источник