본문 바로가기
dev/Spring-security

[Spring] UserDetailsService 활용

by dev_Step 2022. 8. 5.

 

JDBC를 이용하는 방식도 DB를 처리해서 편리하게 사용할 수 있기는 하지만 

사용자의 여러 정보들 중에 제한적인 내용만을 이용한다는 단점이 있다.

username, password, authority, enabled 컬럼을 이용하여 user-by-username-query / authorities-by0username-query

을 통해서 사용자의 권한을 확인 했는데.

 

이외의 다양한 이름이나, 이메일 등의 자세한 정보를 이용할경우에는 충분하지 못한다는 단점이 있다.

이러한 문제점을 해결하기 위해서는

직접 UserDetailsService를 구현하는 것이 좋은데 흔히 Custom UserDetailsService라고 합니다.

이를 이용하면 사용자가 원하는 객체를 인증과 권한 체크에 사용할수 있기 떄문입니다.

 

Spring security의  UserDetailsService interface는 1개의 메서드가 있다

- UserDetails      loadUserByUsername(String username);

UserDetails는 인터페이스로 사용자의 정보와 권한 정보등을 담는 타입으로 여러 추상메서드를 가지고 있습니다.

 

따라서 개발전에 직접 UserDetails 인터페이스를 구현한 여러 하위 클래스를 사용할지, 직접 구현할지를 결정합니다.

보통 여러 하위클래스 중 User클래스를 상속하는 형태입니다. 

 

Custom UserDetailsService 를 사용하기 위하여 

DB table 생성과 

DB작업을 위한 VO, Mapper(DAO), mapper.xml 등을 생성합니다.

 

 

CustomUserDetailsService 구성

 >> 위와 같이 Mybatis를 이용하여 MemberVO와 같이 회원 처리하는 부분이 구성되었다면 이를 이용하여 Spring security의 UserDetailsService를 구현하는 클래스를 직접 작성해보자 

 >> CustomUserDetailsService -> UserDetailsService를 상속하며, MemberMapper타입의 인스턴스를 주입받아서 기능을 구현한다.

즉 CustomUserDetailsService는 MemberMapper(dao)를 주입받아 DB에서 loadUserByUsername을 통해서 사용자의 정보를 가지고 오는 역할을 한다.

 

security-context.xml Bean등록

<security:authenticaton-provider user-serivce-ref=""> 를 추가할떄는 

자식요소로 <user-serivce>를 가질수 없다는 것으로 아래 있는 dataSouruce를 주석 처리해주면된다.

 

 

또 CustomUserDetailsService 에서 loadUserByUsername()를 통해서 DB에서 사용자 정보를 가지고 오는데

이때 MemberVO가 UserDetails 로 return 되므로 형식을 바꿔줘야한다.

MemberVO를 UserDetails로 변경해줘야 하는데 이것을 위해서 CustomUser를 생성한다 이때 VO를 매개변수로 넣어준다.

이 CustomUser는     -> User 를 상속하고 -> UserDetails을 상속한다. 따라서 CustomUser를 통해서 MemberVO를 UserDetails로 변경할 수 있다.

 

마지막으로 CustomUserDetailsService에서 CustomUser를 리턴할 수 있게 처리해준다.

 

 

============================================================================================해볼것 CustomUserDetailsService를 사용할때 실행순서 와

jdbc-user-service를 사용할떄 실행순서와

inmemory방식일떄의 실행 순서를