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

В настоящее время я работаю над веб-проектом с использованием JSF 2.0, Tomcat 7 и MongoDB. У меня большой вопрос о том, как обрабатывать управление сеансами и аутентификацию / авторизацию с пользователями в базе данных.

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

  • create.xhtml -> только для зарегистрированных пользователей.
  • events.xhtml -> публично для всех.

Основная структура, которую я планирую:

  • Проверьте, требует ли страница авторизованного пользователя (например, create.xhtml)
  • Если да, проверьте, авторизован ли пользователь
  • Если пользователь не вошел в систему, перейдите к login.xhtml
  • Если вы успешно вошли в систему, вернитесь на запрашиваемую страницу
  • Сохраняйте информацию "Пользователь вошел в систему", если пользователь не нажмет кнопку выхода из системы. (там я думаю @SessionScoped попадает в игру)

Вопрос в том:

  1. Какой менее сложный способ сделать это?
  2. Где я должен использовать @SessionScoped аннотаций? В Create.java или жеLoginManager.java?
  3. Весенняя безопасность выглядит довольно сложной для моей проблемы, она мне действительно нужна? Если да, то можете ли вы немного объяснить, как реализация работает вместе с 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 это очень по-спартански; нет "запомнить меня", плохая обработка ошибок, нет ограничений на основе разрешений.

Смотрите также:


2. Доморощенный сервлет-фильтр

Это обеспечивает гораздо более детальный контроль, но вам нужно будет написать весь код самостоятельно, и вы должны действительно знать / понимать, как вы должны реализовать такой фильтр, чтобы избежать потенциальных дыр в безопасности. На стороне JSF вы можете, например, просто поместить вошедшего в систему пользователя в качестве атрибута сеанса: sessionMap.put("user", user) и проверьте в фильтре, если session.getAttribute("user") не является null,

Преимущества:

  • Мелкозернистый контроль.
  • Полностью не зависит от контейнера.

Недостатки:

  • Переосмысление колеса; новые функции требуют много кода.
  • Как стартер, вы никогда не уверены, что ваш код на 100% надежен.

Смотрите также:


3. Адаптировать сторонние фреймворки

Например, Apache Shiro, Spring Security и т. Д. Это обычно предлагает гораздо более детальные параметры конфигурации, чем стандартная управляемая контейнером аутентификация, и вам не нужно писать какой-либо код для этого самостоятельно, за исключением страницы входа и некоторой (XML) конфигурации. конечно.

Преимущества:

  • Мелкозернистый контроль.
  • Полностью не зависит от контейнера.
  • Нет переизобретения колеса; минимум собственного кода.
  • Тщательно разработано и протестировано многими пользователями, поэтому, скорее всего, на 100% надежно.

Недостатки:

  • Некоторая кривая обучения.

Смотрите также:

Другие вопросы по тегам