티스토리 뷰

728x90

 

 

 

 

개인적인 공부용이니까

참고만 해주십시오....

이해가 안될 수 있습니다....

 

 

 

오늘은

스프링 시큐리티를 이용하여

인증을 하고자할때 사용되는

UserDetailsService를 커스텀하는 것에 대해 알아보려고 한다.

 

책을 그냥 보기만 하면 이해가 안되서

적어가면서 정리..

 

 

 

아무튼

 

 

무작정 만들기 전에 이걸 왜 하는지 정도는 알자..

(뚝딱뚝딱)

 

 

UserDetailsService를 왜 커스텀하나요?

A: 인증 매니저를 커스텀하고 싶기 때문입니다.

 

커스텀을 하는 이유가 뭔가요?

A: 원하는 방식으로 스프링 시큐리티를 이용하고자하기 때문입니다.

 

인증 매니저가 뭔데요?

A: 인증에 대한 실제적인 처리를 담당하는 인터페이스입니다.

 

 

UserDetailsService와 인증매니저(Authentication Manager)와의 관계는??

A: 이건....

 

 

인증 매니저는 인증 처리를 한 다음 결과를 UserDetails 타입으로 반환하는데

이 때 UserDetailsService를 써서 정보를 어떻게 처리할지(인증되는방식) 판단한다.

 

InMemoryUserDetailsManager, JdbcUserDetailsManager도 UserDetailsService를 구현한 것

 

 

결론. 내가 원하는 대로 인증 처리하기 위해서

UserDetailsService를 커스텀한다.

=> DB를 사용해서 인증 처리 하고자 할 때 사용하게 되는것 같음..!

 

 

"개발자가 인증 매니저를 커스텀하려면 UserDetailsService 인터페이스를 구현하고,

이를 HttpSecurity 객체가 사용할 수 있도록 지정해야한다"

 

 

어떻게 하냐면,

...

UserDetailsService를 구현하는 클래스를 하나 만든다. 

@Service
public  class CustomUsersService implements UserDetailsService{

	@Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException{
    	return ..;
    }

}

loadByUserByUsername 메서드가 오버라이드 되는데

이 메서드가 뭐냐면

사용자의 계정 정보(아이디)를 이용해 UserDetails 인터페이스를 구현하고

그 객체를 반환하는 메서드

(나중에 자세한 설명..)

 

암튼 구현한 클래스를 http 객체가 사용할 수 있도록 주입하고 지정하면 된다.

내가 참고하는 책에서는 SecurityConfig 설정의 configure 메서드의 파라미터 http에게 넘겼다...

http.userDetailsService(zecorkUsersService);

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter{

	@Override
    protected void configure(HttpSecurity http) throws Exception{
    	http.userDetailsService(CustomUsersService);
        ...
    }
}

loadByUserByUsername에서 UserDetails 타입 객체(User 클래스)를 반환할 수 있도록 한다.

(User클래스: UserDetails를 구현해 둔 클래스)

 

 

 

그런 다음 내가 하던 프로젝트의 데이터들과 연결해야한다.

MemberRepository와 연동한다.

@Autowired
MemberRepository memberRepo;

@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException{
	return memberRepo.findById(username)
    		.filter(member -> member != null)
            .map(member -> new CustomSecurityUser(member))
            .get();
}

 

 

여기까지만 씁니다...

 

나중에는 지금보다 더 잘 이해되겠지

 

참고한 자료 | 스타트스프링부트

 

 

728x90
댓글
250x250
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함