Spring Security/Технический обзор Spring Security: различия между версиями

Содержимое удалено Содержимое добавлено
Строка 36:
Это еще один пункт на который стоит обратит внимание в приведенном выше фрагменте кода, в котором мы можем получить принципала из объекта <code>Authentication</code>. Принципал это просто <code>Object</code>. В большинстве случаев это может быть приведен к объекту <code>UserDetails</code>. <code>UserDetails</code> является одним из центральных интерфейсов Spring Security. Он представляет собой принципала, но в расширенном виде и с учетом специфики приложения. Думайте о <code>UserDetails</code> как об адаптере между вашей собственной БД пользователей и тем что требуется Spring Security внутри <code>SecurityContextHolder</code>. Будучи представлением чего-то из вашей БД пользователей, <code>UserDetails</code> довольно часто приводится к исходному объекту Вашего приложения, для того, чтобы вызвать бизнес-методы (такие как, <code>getEmail()</code>, <code>getEmployeeNumber()</code> и т. п.).
 
Возможно вы удивлены, когда я предоставил <code>UserDetails</code> объект? Как я это сделал? Я думюдумаю, вы сказали, это было сделано декларативным способом и мне не потребовалось писать никакого Java кода — в этом дело? Короткий ответ заключается в том, что существует специальный интерфейс, называемый <code>UserDetailsService</code>. Единственный метод этого интерфейса принимает имя пользователя в виде String и возвращает <code>UserDetails</code>:
 
<source lang="java">
Строка 42:
</source>
 
Это наиболее общий подход к загрузке информации о пользователе в Spring Security и вы увидите, что это используесяиспользуется в каркасе когда требуется информация о пользователе.
 
В случае успешной аутентификации, <code>UserDetails</code> используется для создания <code>Authentication</code> объекта, который хранится в <code>SecurityContextHolder</code> (подробнее об этом ниже). Хорошая новость заключается в том, что мы предлагаем целый ряд реализаций <code>UserDetailsService</code>, одна из них хранит данные в памяти (<code>InMemoryDaoImpl</code>), а другая использует JDBC (<code>JdbcDaoImpl</code>). Большинство пользователей, как правило пишут свои собственные реализации, поверх существующих объектов доступа к данным (DAO), который представляют их сотрудников, клиентов и других пользователей приложения. Помните то преимущество, что независимо от вашего <code>UserDetailsService</code> эти же данные можно получить из <code>SecurityContextHolder</code> с помощью приведенного выше фрагмента кода.