20 октября 2008

Spring Security : хранение пользователей в БД. часть 1

В предыдущей заметке по Spring Security (SS) я рассмотрел пример использования SS. Пример был примитивный, ориентированный исключительно на знакомство с SS.
Теперь более подробно рассмотрим вопрос хранения данных о пользователях. В первом примере эти данные были забиты раз и навсегда в xml файл и как либо оперировать ними было невероятно трудно. Более привычный способ хранения пользователей - это база данных.
В SS реализован UserDetailsService, который позволяет получать информацию о пользователях посредством jdbc подключения к базе данных, для этого достаточно в конфигурации зарегистировать бин:
<bean id="userDetailsService" class="org.springframework.security.userdetails.jdbc.JdbcDaoImpl">
  <property name="dataSource" ref="dataSource"/>
</bean> 
 

Где в качестве dataSource используется бин настроек подключения к бд, например:
   <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  <property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
  <property name="url" value="jdbc:hsqldb:hsql://localhost:9001"/>
  <property name="username" value="sa"/>
  <property name="password" value=""/>
</bean>


При это в базе данных должна существовать следующая схема: таблицы users и authorities, а также внешний ключ.
  CREATE TABLE users (
  username VARCHAR(50) NOT NULL PRIMARY KEY,
  password VARCHAR(50) NOT NULL,
  enabled BIT NOT NULL
  );
 
  CREATE TABLE authorities (
  username VARCHAR(50) NOT NULL,
  authority VARCHAR(50) NOT NULL
  );
 
  ALTER TABLE authorities ADD CONSTRAINT fk_authorities_users foreign key (username) REFERENCES users(username);

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

6 комментариев:

Анонимный комментирует...

убери пожалуйста фоновую музыку - читать невозможно

Rumoku комментирует...
Этот комментарий был удален автором.
Анонимный комментирует...

thx

Sergey комментирует...
Этот комментарий был удален автором.
Sergey комментирует...

А если надо логиниться по имейлу, то как это можно реализовать? Спасибо.

Rumoku комментирует...

Sergey,
тебе надо реализовать свою имплементацию UserDetailsService.
Вот пример http://forum.springsource.org/showthread.php?53814-Custom-implementation-of-Spring-Security-s-UserDetailsService-with-Jpa-Hibernate