Используйте Spring Security с JPA - PullRequest
       13

Используйте Spring Security с JPA

16 голосов
/ 20 декабря 2010

Я новичок в весне.

Мы используем функцию безопасности весны. Подключение к базе данных: реализация eclipselink в JPA. База данных: MySql

При использовании Spring Security конфигурация провайдера аутентификации выглядит следующим образом, -

<authentication-provider>

    <jdbc-user-service id="userDetailsService" data-source-ref="Datasource" />

    </authentication-provider>

Но в JPA мы не определяем источник данных, мы используем единицу постоянства с провайдером jpa.PersistenceProvider.

Итак, как нам настроить провайдера аутентификации, чтобы использовать JPA для подключения к базе данных?

Что именно должно содержать поле data-source-ref, чтобы использовать базу данных для аутентификации?

Заранее спасибо.

Ответы [ 2 ]

22 голосов
/ 20 декабря 2010

В основном вам, вероятно, нужно реализовать UserDetailsService себя .

Так, например, у вас будет сущность User, а ваша реализация UserDetailsServiceбудет искать пользователя и преобразовывать его в UserDetails объект (или ваша сущность должна будет реализовать UserDetails).

Пример реализации:

public class MyUserDetailsService implements UserDetailsService{

    private EntityManager entityManager;
    @PersistenceContext
    public void setEntityManager(EntityManager newEm){
        this.entityManager = newEm;
    }

    public UserDetails loadUserByUsername(String username){

        // assuming that you have a User class that implements UserDetails
        return entityManager.createQuery("from User where username = :username", User.class)
                            .setParameter("username", username)
                            .getSingleResult();

    }
}

И вы добавляете это пользователю spring-security.xml

<authentication-manager>
   <authentication-provider user-service-ref="MyUserDetailsService" />
</authentication-manager>
12 голосов
/ 20 декабря 2010

Более простой способ аутентификации в вашем случае - заставить один из классов уровня обслуживания реализовать интерфейс org.springframework.security.core.userdetails.UserDetailsService.Этот интерфейс содержит только один метод UserDetails loadUserByUsername(String username).Вы должны убедиться, что вы возвращаете экземпляр UserDetails для данного имени пользователя.

public UserDetails loadUserByUsername(String username)
        throws UsernameNotFoundException, DataAccessException {
    // load and return user using your regular JPA techniques here
        ...
    }

После того, как вы реализовали этот метод в своем классе обслуживания, вам просто нужно будет добавить его ссылку на ваш файл конфигурации Spring:

<authentication-manager>
     <authentication-provider user-service-ref="myServiceLayerClassInstance">
     </authentication-provider>
</authentication-manager>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...