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

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

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

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

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

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

Возникает вопрос:

  • Каков менее сложный способ сделать это?
  • Где я должен использовать аннотацию @SessionScoped? В Create.java или LoginManager.java?
  • Spring Безопасность выглядит сложной для моей проблемы, действительно ли я нужно это? если да, можете ли вы немного объяснить, как реализация работает вместе с 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 Security Spec должен решить это с помощью JASPIC.
  • Перед Java EE 8 нет мелкозернистого элемента управления.
  • До Java EE 8 он очень спартански; нет "помни меня", плохой обработки ошибок, ограничений на основе разрешений.

См. также:


2. Homegrow a фильтр сервлета

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

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

  • Четкое управление.
  • Полностью независимый контейнер.

Недостатки:

  • Ослабление колеса; новые функции требуют большого количества кода.
  • В качестве стартера вы никогда не будете уверены, что ваш код на 100% устойчив.

См. также:


3. Адаптировать стороннюю структуру

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

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

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

Недостатки:

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

См. также: