Как обрабатывать аутентификацию / авторизацию с пользователями в базе данных?
В настоящее время я работаю над веб-проектом с использованием JSF 2.0, Tomcat 7 и MongoDB. У меня большой вопрос о том, как обрабатывать управление сеансами и аутентификацию / авторизацию с пользователями в базе данных.
Структура, которую я хочу, выглядит следующим образом: только зарегистрированные пользователи могут создавать события, и каждый может видеть созданные события.
create.xhtml
-> только для зарегистрированных пользователей.events.xhtml
-> публично для всех.
Основная структура, которую я планирую:
- Проверьте, требует ли страница авторизованного пользователя (например,
create.xhtml
) - Если да, проверьте, авторизован ли пользователь
- Если пользователь не вошел в систему, перейдите к
login.xhtml
- Если вы успешно вошли в систему, вернитесь на запрашиваемую страницу
- Сохраняйте информацию "Пользователь вошел в систему", если пользователь не нажмет кнопку выхода из системы. (там я думаю
@SessionScoped
попадает в игру)
Вопрос в том:
- Какой менее сложный способ сделать это?
- Где я должен использовать
@SessionScoped
аннотаций? ВCreate.java
или жеLoginManager.java
? - Весенняя безопасность выглядит довольно сложной для моей проблемы, она мне действительно нужна? Если да, то можете ли вы немного объяснить, как реализация работает вместе с JSF 2.0 и Mongo DB?
1 ответ
Есть несколько вариантов. Что выбрать, зависит только от вас. Просто объективно взвесьте конкретные преимущества, а недостатки соответствуйте вашей собственной ситуации.
1. Использовать управляемую контейнером аутентификацию Java EE
Просто объявите <security-constraint>
в web.xml
который ссылается на область безопасности, настроенную в servletcontainer. Вы можете для своего веб-приложения указать шаблоны URL, которые должны быть проверены на предмет входа в систему и / или роли, например /secured/*
, /app/*
, /private/*
, так далее.
До Java EE 8, к сожалению, вам все еще нужно настроить реальный уровень безопасности в зависимости от сервлет-контейнера. Обычно это описывается в документации к сервлетконейнеру. В случае с Tomcat 8 это Realm HOW-TO. Например, область на основе базы данных на основе таблиц пользователей / ролей описана в разделе "JDBCRealm".
Начиная с Java EE 8, наконец, появится стандартный API на основе JSR-375.
Преимущества:
- Относительно быстрый и простой в настройке и использовании.
- Начиная с Java EE 8 наконец-то появился надежный и гибкий стандартный API.
Недостатки:
- До Java EE 8 конфигурация области зависела от контейнера. В Java EE 8 новая спецификация безопасности JSR-375 должна решить эту проблему с помощью JASPIC.
- До Java EE 8 не было детального контроля.
- До Java EE 8 это очень по-спартански; нет "запомнить меня", плохая обработка ошибок, нет ограничений на основе разрешений.
Смотрите также:
- Выполнение аутентификации пользователя в Java EE / JSF с использованием j_security_check - содержит полные примеры кода
- Исходное приложение Java EE - пример веб-приложения (разработанного мной), которое также демонстрирует аутентификацию Java EE 8 с помощью Soteria (JSR-375 RI).
2. Доморощенный сервлет-фильтр
Это обеспечивает гораздо более детальный контроль, но вам нужно будет написать весь код самостоятельно, и вы должны действительно знать / понимать, как вы должны реализовать такой фильтр, чтобы избежать потенциальных дыр в безопасности. На стороне JSF вы можете, например, просто поместить вошедшего в систему пользователя в качестве атрибута сеанса: sessionMap.put("user", user)
и проверьте в фильтре, если session.getAttribute("user")
не является null
,
Преимущества:
- Мелкозернистый контроль.
- Полностью не зависит от контейнера.
Недостатки:
- Переосмысление колеса; новые функции требуют много кода.
- Как стартер, вы никогда не уверены, что ваш код на 100% надежен.
Смотрите также:
- Есть ли простой способ предварительной обработки и перенаправления запросов GET? - содержит вводное объяснение и пример для аутентификации
- Перенаправление авторизации по истечении срока сеанса не работает при отправке формы JSF, страница остается прежней - содержит более расширенный пример запуска для аутентификации, который также охватывает запросы AJAX
- JSF: Как контролировать доступ и права в JSF? - содержит стартовый пример для авторизации
3. Адаптировать сторонние фреймворки
Например, Apache Shiro, Spring Security и т. Д. Это обычно предлагает гораздо более детальные параметры конфигурации, чем стандартная управляемая контейнером аутентификация, и вам не нужно писать какой-либо код для этого самостоятельно, за исключением страницы входа и некоторой (XML) конфигурации. конечно.
Преимущества:
- Мелкозернистый контроль.
- Полностью не зависит от контейнера.
- Нет переизобретения колеса; минимум собственного кода.
- Тщательно разработано и протестировано многими пользователями, поэтому, скорее всего, на 100% надежно.
Недостатки:
- Некоторая кривая обучения.
Смотрите также:
- JSF2 - руководство по Shiro - обширное руководство по интеграции Shiro в веб-приложение JSF2