본문 바로가기
Spring

Spring Framework : Spring security customizing

by autumnly 2017. 5. 29.


스프링 시큐리티에서 기본적으로 제공하는 

org.springframework.security.core.userdetails.UserDetails 인터페이스를 통해 인증받은 사용자의 정보를 조회할 수 있다.

하지만 기본설정으로 사용하면 사용자의 이름, 패스워드 외에 다른 정보를 불러오는 것은 불가능하다.


이 때, UserDetails 인터페이스를 구현하는 커스텀 클래스를 만듦으로써 원하는 정보를 조회할 수 있다.

(UserDetails 인터페이스를 구현한 org.springframework.security.core.userdetails.UserDetails.User 클래스를 참고하면 좋다)

UserDetails 인터페이스를 구현한 클래스는 말그대로 user의 정보를 담고 있는 클래스이다. 본인이 원하는 정보(계정, 비밀번호를 포함해 이름, 나이 등)를 추가해 사용할 수 있다.


UserDetails 인터페이스를 구현한 클래스를 만들었다면,

이를 DB와 연동하여 권한을 검사하고 정보를 얻어올 차례다.




org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl 클래스는 사용자의 계정, 비밀번호를 입력받아 DB에서 권한을 조회하는 기능을 제공한다. 이 클래스는 org.springframework.security.core.userdetails.UserDetailService 인터페이스를 구현하는데, 이 인터페이스에는 loadUserByUsername이라는 메소드가 있다.

이 메소드는 UserDetails loadUserByUsername(String username) 의 형태를 가지고 있다. 

유저의 이름을 가지고 UserDetails 객체를 리턴하는데, 앞서 언급한 바로 그 UserDetails 인터페이스의 객체이다.


loadUserByUsername 메소드에서 우리가 만든 UserDetails인터페이스를 구현하는 클래스의 객체를 리턴해주면 되는것이다.


JdbcDaoImpl 클래스가 이미 UserDetailService 인터페이스를 구현하고 있기 때문에, JdbcDaoImpl 클래스를 상속받아 커스텀 클래스를 만들어 사용하면 된다.


핵심이 되는 메소드는 loadUsersByUsername 메소드와 loadUserByUsername메소드이다. (Users와 User의 차이)

loadUserByUsername메소드의 첫줄에서 loadUsersByUsername을 호출하여 user의 리스트를 구한다.


loadUsersByUsername메소드에서는 username을 파라미터로 받아 쿼리문을 통해 DB에서 user의 정보를 가지고오며, 이 때 정보는 UserDetails를 구현한 클래스의 객체에 담긴다.

(JdbcDaoImpl클래스가 어떻게 구현되었는지를 참고하며 커스터마이즈하면 좋다)


참고 : http://zgundam.tistory.com/49