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

Я новичок в Spring.

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

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

<authentication-provider>

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

    </authentication-provider>

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

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

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

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


person Sagar    schedule 20.12.2010    source источник


Ответы (2)


В основном вам, вероятно, нужно реализовать 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>
person Sean Patrick Floyd    schedule 20.12.2010
comment
Ваш пользовательский UserDetailsService будет использовать JPA (и вашу схему БД) для создания объекта UserDetails. - person AngerClown; 20.12.2010
comment
Ну да, я думал, что это было довольно очевидно :-) - person Sean Patrick Floyd; 20.12.2010
comment
Я, конечно, имел в виду UserDetailsService, а не AuthenticationUserDetailsService. - person Sean Patrick Floyd; 20.12.2010
comment
привет, спасибо за ответ, но как мне настроить службу userdetail. любой справочный код поможет. спасибо вам всем - person Sagar; 21.12.2010
comment
@Sean Патрик Флойд: Можете ли вы предложить какой-либо учебник или полезную ссылку для безопасности Spring с помощью jpa. Или вы можете показать, «как реализованные методы класса userDetails выглядят в классе User?» - person Sagar; 07.02.2011

Более простой способ аутентификации в вашем случае - заставить один из ваших классов сервисного уровня реализовать интерфейс 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>
person craftsman    schedule 20.12.2010
comment
Это лучший ответ - имхо - person peterchaula; 17.12.2018