본문으로 바로가기
728x90
반응형
SMALL

MyBatis로 가져온 MemberVO 정보를 스프링 시큐리티 타입에 맟춰서 사용할려면 UserDetails 타입으로 변환해야한다.

변환을 해줘야지만이 스프링 시큐리티를 사용할 수 있다.

1.User

UserDetails의 구현클래스인 User 클래스를 확장받아 변환을 진행할것이다.

CustomUser

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Getter
public class CustomUser extends User{
 
    private static final long serialVersionUID = 1L;
    
    private MemberVO member;
    
    public CustomUser(String username, String password, Collection<extends GrantedAuthority> authorities) {
        super(username, password, authorities);
    }
    
    public CustomUser(MemberVO vo) {
        
        super(vo.getUserid(), vo.getUserpw(), vo.getAuthList().stream().map(auth -> new SimpleGrantedAuthority(auth.getAuth())).
                collect(Collectors.toList()));
        
        this.member = vo;
        
    }
 
}
cs

UserDetails 인터페이스를 구현하는 방법도 있으나 기존의 클래스를 수정하지 않고 확장하는 방식으로 진행한다.

12행: MemberVO를 파라미터로 전달해서 User 클래스에 맞게 생성자를 호출

14행: AuthVO 인스턴스는 SimpleGrantedAuthority(스프링시큐리티 권한 객체)로 변환하여 처리

17행: 변환된 값을 저장

 

CustomUserDetailsService

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Log4j
public class CustomUserDetailsService implements UserDetailsService{
 
    @Setter(onMethod_ = {@Autowired})
    private MemberMapper memberMapper;
    
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
 
        log.warn("Load User By UserName : "+username);
        
        MemberVO vo = memberMapper.read(username);
        
        log.warn("queried by member mapper: " + vo);
        return vo == null ? null : new CustomUser(vo);
    }
 
}
 
 
출처: https://pulpul8282.tistory.com/151 [기억의 파편들]
cs

8행: loadUserByUsername()은 내부적으로 MemberMapper를 이용해서 MemberVO를 조회하고

MemberVO는 우리가 이미 CustomUser 클래스에서 CustomUser(스프링-시큐리티)타입으로 변환을 했기때문에 동작이 가능하다. 

 

 

728x90
반응형
LIST