Как настроить аутентификацию базы данных Spring Security 2 с помощью аннотированных классов Hibernate 3? - PullRequest
3 голосов
/ 23 февраля 2010

Я создаю приложение, используя Hibernate 3 (с аннотациями JPA), Spring 2.5 и Spring Security 2.0.5.

Я хочу знать, что мне нужно поместить в мой тег <authentication-provider> в моем конфигурационном файле Spring (applicationContext-security.xml), чтобы я мог заставить Spring Security использовать мой существующий класс уровня службы (AuthenticationService), который имеет дело с с моими объектами User и Role.

Я понимаю, что Spring Security требует наличия двух таблиц со следующей схемой:

     create table users(
      username varchar_ignorecase(50) not null primary key,
      password varchar_ignorecase(50) not null,
      enabled boolean not null);

  create table authorities (
      username varchar_ignorecase(50) not null,
      authority varchar_ignorecase(50) not null,
      constraint fk_authorities_users foreign key(username) references users(username));

  create unique index ix_auth_username on authorities (username,authority);;

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

Может ли кто-нибудь указать мне правильное направление здесь? Я не могу найти какую-либо полезную документацию, и я не уверен, возможно ли то, что я хочу сделать.

Спасибо!

Ответы [ 3 ]

8 голосов
/ 23 февраля 2010

Вы можете реализовать пользовательский UserDetailsService в качестве моста между вашим доменом и Spring Security. Затем вы добавляете Spring Security следующим образом (для Spring Security 2.x):

<security:authentication-provider user-service-ref='myUserDetailsService'/>

<bean id="myUserDetailsService" class="... your implementation ...">
    ...
</bean>
1 голос
/ 25 февраля 2010

Сделайте то, что сказал axtavt, или, если вам ничего не нужно, кроме попадания в пользовательскую таблицу, вы можете переопределить запрос:

<security:authentication-provider>
     <jdbc-user-service data-source-ref="dataSource" 
        authorities-by-username-query="SELECT u.username, a.authority FROM users u, authorities a WHERE u.username = a.username AND u.username = ?" />
        users-by-username-query="SELECT username, password, enabled FROM users WHERE username = ?" />
</security:authentication-provider>

Я бы сделал то, что предложил Axtavt, хотя. Вы можете создать DTO (объект передачи данных), который реализует объект Spring Security User. Это позволит вам получить доступ к соответствующим данным при извлечении пользователя из SecurityContextHolder:

Object o = SecurityContextHolder.getContext().getAuthentication().getDetails();
UserDetailsDTO u = (UserDetailsDTO) o;
User user = u.getUser();
// now you have primary key, etc., etc.

Вам сейчас действительно не нужно это смотреть на ваши таблицы, но IMO, ваша схема нуждается в работе.

1 голос
/ 23 февраля 2010

Определите свой пользовательский AutenticationManager, используя <bean id="myAuthenticationManager" class="com.security.MyAuthunticationManager"/>, а класс MyAutenticationManager должен реализовать org.springframework.security.AuthenticationManager и переопределить метод authenticate(Authentication authentication), в котором вы будете использовать пользовательский сервис и объекты домена для проверки учетных данных пользователя и добавления его роли для объекта аутентификации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...