[Spring Boot] DB 기반 로그인 구현

Coco Park·2024년 1월 10일
0

Spring_Boot

목록 보기
7/13

앞서 DB에 저장된 유저의 정보로 로그인을 하는 과정을 구현하고자 한다.

Login View 단에서 데이터를 전달하면, SecurityConfig에 정의된 로그인 처리 URL을 통해 진행한다.

이때 차이점은, Spring Security의 Login은 UserDetailsService를 구현한 커스텀 서비스 클래스를 호출하여 DB에서 데이터를 받아온다.

이후에, 존재하는 유저라면 UserDetails를 구현한 커스텀 유저 디테일 객체를 만들어서 반환해준다. 만약, 반환한 데이터가 없다면 로그인이 실패한 것으로 처리된다.

이를 간단하게 모식도로 나타내면 다음과 같다.

추가적으로 구현한 내용은, Spring Security가 호출할 서비스와 호출한 후의 결과를 전달할 DTO를 정의하는 것이다.

1. CustomUserDetailsService

@Service
public class CustomUserDetailsService implements UserDetailsService {

    private final UserRepository userRepository;
   
    public CustomUserDetailsService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
		// Repository를 호출하여 해당하는 유저가 있는지를 찾아옴
        UserEntity userdata = userRepository.findByUsername(username);
		// 존재하는 경우 새로운 CustomUserDetails를 정의하여 Spring Security로 반환해줌
        if(userdata != null) {
            // id가 제대로 전달되는지 체크
            System.out.println("userdata id : " + userdata.getUsername());
            return new CustomUserDetails(userdata);
        }
        // id가 없는 경우 체크
        System.out.println("There is any id");
        return null;
    }
}

2. CustomUserDetails

public class CustomUserDetails implements UserDetails {

    private final UserEntity userEntity;

    public CustomUserDetails(UserEntity userEntity) {
        this.userEntity = userEntity;
    }

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {

        // 권한을 ArrayList에 넣어서 반환함
        Collection<GrantedAuthority> collection = new ArrayList<>();

        collection.add(new GrantedAuthority() {
            @Override
            public String getAuthority() {
                return userEntity.getRole();
            }
        });
        return collection;
    }

    @Override
    public String getPassword() {return userEntity.getPassword();}

    @Override
    public String getUsername() {return userEntity.getUsername();}

    @Override
    public boolean isAccountNonExpired() {return true;}

    @Override
    public boolean isAccountNonLocked() {return true;}

    @Override
    public boolean isCredentialsNonExpired() {return true;}

    @Override
    public boolean isEnabled() {return true;}
}

1) 로그인 View

2) 로그인 후 main으로 전환된 View

3) 로그인 시 CustomUserDetailsService에서 유저의 id를 체킹한 모습

profile
ヽ(≧□≦)ノ

0개의 댓글