Столкнулся тут с необходимостью хранения в контексте безопасности дополнительной информации о пользователе (помимо имени и прав), например, полного ФИО. При этом в качестве UserDetailsService использовался org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl, извлекающий информацию о пользователе из БД PostgreSQL (из таблиц users и authorities), и кладущий в контекст безопасности объект класса org.springframework.security.core.userdetails.User.
Для того, чтобы реализовать хранение дополнительных данных о пользователе, нужно:
- Добавить соотв. колонки для хранения доп. информации в таблицу users базы данных
- Реализовать свой класс, реализующий интерфейс UserDetails, представляющий пользователя, с необходимыми свойствами для хранения доп. информации и методами доступа к ним. Класс можно унаследовать от org.springframework.security.core.userdetails.User, определив необходимые конструкторы, переопределив метод toString и добавив все необходимые свойства / методы для хранения доп. информации о пользователе.
- Реализовать свой класс, реализующий интерфейс UserDetailsService, который сохранял бы в контексте безопасности объект класса из п.2. Можно унаследовать org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl, переопределив метод loadUsersByUsername, извлекающий информацию из БД и метод createUserDetails, сохраняющий пользователя в контексте безопасности.
- Настроить Spring Security на использование созданного UserDetailsService с помощью атрибута user-service-ref тега authentication-provider и бина, инициализирующего объект созданного на п.3. класса:
class="my.package.myUserDetailsServiceImpl">
<beans:property name="dataSource" ref="dataSource"/>
</beans:bean>
<authentication-manager> - Всё, теперь полученный вызовом SecurityContextHolder.getContext().getAuthentication().getPrincipal() объект можно приводить к созданному в п.2 классу и вызывать методы доступа к дополнительным информационным полям.
<authentication-provider user-service-ref='myUserDetailsService'>
<password-encoder hash="md5" />
</authentication-provider>
</authentication-manager>
Комментариев нет:
Отправить комментарий