2017-02-18 17 views
2

Spring безопасности имеет базовый класс, который представляет аутентификацией пользователя (org.springframework.security.core.userdetails.User):Упорство org.springframework.security.core.userdetails.User или UserDetails

Модели основной пользовательской информации извлеченной с помощью UserDetailsService.

Разработчики могут использовать этот класс напрямую, подклассифицировать его или написать свою собственную реализацию UserDetailsс нуля.

В большинстве примеров по Интернету, например here люди обычно создают отдельный класс для персистенции, то есть com.mkyong.users.model.User в примере. Этот класс не распространяется на пружинах безопасности один, так что теперь у нас есть два пользователя, один для упорства и один представляет аутентификацию пользователя в системе, все, что мы делаем это:

  1. Получить сохраняемости пользователя по имени пользователя и пароль
  2. поля Копирование к прыжку пользователя и вернуть его

Итак, мой вопрос, в чем смысл иметь больше одного объекта пользователя? Разве не лучше ли продлить весеннюю безопасность пользователя и сохранить его вместо этого? Это может быть невозможно с аннотациями hibernate/jpa, потому что мы явно не можем помещать аннотации в весенний код безопасности, однако это можно сделать с помощью файлов сопоставления. Еще одна проблема заключается в том, что мы не должны возвращать объект спящего режима из службы, чтобы избежать всех связанных с спящим режимами проблем вне уровня сервиса, поэтому, если я продлю весенний пользователь и сделаю его сущностью, мне все равно понадобится какой-то POJO для возврат от UserDetailsService. Это то, почему нам нужны два объекта User?

P.s. ссылка на документацию ценится

+0

Ваша модель должна быть отделена от библиотек, которые вы используете.Рассмотрим, что новый менеджер-разработчик хочет, чтобы проект был перенесен с Spring на EJB, тогда вам не нужно изменять ВСЕ (pojo, dao, sevice ...) –

ответ

2

Основные причинами являются:

  • разделения ответственности
  • единой ответственности Принципа

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

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

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

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