barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

пятница, 13 января 2012 г.

Spring Security: расширение информации о принципале безопасности

Столкнулся тут с необходимостью хранения в контексте безопасности дополнительной информации о пользователе (помимо имени и прав), например, полного ФИО. При этом в качестве UserDetailsService использовался org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl, извлекающий информацию о пользователе из БД PostgreSQL (из таблиц users и authorities), и кладущий в контекст безопасности объект класса org.springframework.security.core.userdetails.User.
Для того, чтобы реализовать хранение дополнительных данных о пользователе, нужно:
  1. Добавить соотв. колонки для хранения доп. информации в таблицу users базы данных
  2. Реализовать свой класс, реализующий интерфейс UserDetails, представляющий пользователя, с необходимыми свойствами для хранения доп. информации и методами доступа к ним. Класс можно унаследовать от org.springframework.security.core.userdetails.User, определив необходимые конструкторы, переопределив метод toString и добавив все необходимые свойства / методы для хранения доп. информации о пользователе.
  3. Реализовать свой класс, реализующий интерфейс UserDetailsService, который сохранял бы в контексте безопасности объект класса из п.2. Можно унаследовать org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl, переопределив метод loadUsersByUsername, извлекающий информацию из БД и метод createUserDetails, сохраняющий пользователя в контексте безопасности.
  4. Настроить Spring Security на использование созданного UserDetailsService с помощью атрибута user-service-ref тега authentication-provider и бина, инициализирующего объект созданного на п.3. класса:

        <beans:bean id="userDetailsService"
              class="my.package.myUserDetailsServiceImpl">
            <beans:property name="dataSource" ref="dataSource"/>
        </beans:bean>
  5.     <authentication-manager>
            <authentication-provider user-service-ref='myUserDetailsService'>
                <password-encoder hash="md5" />
            </authentication-provider>
        </authentication-manager>  

  6. Всё, теперь полученный вызовом SecurityContextHolder.getContext().getAuthentication().getPrincipal() объект можно приводить к созданному в п.2 классу и вызывать методы доступа к дополнительным информационным полям.

Комментариев нет:

Отправить комментарий