복붙노트

[SPRING] JPA와 함께 Spring Security 사용

SPRING

JPA와 함께 Spring Security 사용

나는 봄에 새로운 사람이다.

우리는 봄 보안 기능을 사용하고 있습니다. 데이터베이스 연결 : JPA의 eclipselink 구현. 데이터베이스 : MySql

스프링 보안을 사용하는 동안 인증 제공자의 구성은 다음과 같습니다 -

<authentication-provider>

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

    </authentication-provider>

그러나 JPA에서는 데이터 소스를 정의하지 않고 jpa.PersistenceProvider 공급자와 함께 Persistence 단위를 사용합니다.

그렇다면 데이터베이스 연결을 위해 JPA를 사용하도록 인증 공급자를 구성하는 방법은 무엇입니까?

인증을 위해 데이터베이스를 사용하기 위해 data-source-ref 필드가 정확히 포함해야하는 것은 무엇입니까?

미리 감사드립니다.

해결법

  1. ==============================

    1.기본적으로 UserDetailsService를 직접 구현해야합니다.

    기본적으로 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>
    
  2. ==============================

    2.귀하의 경우 인증을위한 더 쉬운 방법은 서비스 계층 클래스 중 하나가 org.springframework.security.core.userdetails.UserDetailsService 인터페이스를 구현하도록하는 것입니다. 이 인터페이스는 하나의 메소드 UserDetails loadUserByUsername (String username) 만 포함합니다. 주어진 사용자 이름에 대해 UserDetails 인스턴스를 반환해야합니다.

    귀하의 경우 인증을위한 더 쉬운 방법은 서비스 계층 클래스 중 하나가 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
            ...
        }
    

    서비스 클래스에서이 메서드를 구현하면 스프링 구성 파일 참조를 추가하기 만하면됩니다.

    <authentication-manager>
         <authentication-provider user-service-ref="myServiceLayerClassInstance">
         </authentication-provider>
    </authentication-manager>
    
  3. from https://stackoverflow.com/questions/4489703/use-spring-security-with-jpa by cc-by-sa and MIT license