project/모임웹프로젝트

로그인 기능 구현 중 UserDetails 관련 이슈 (10)

naspeciallist 2024. 9. 30. 12:48

User엔티티를 만들고 이 엔티티를 시프링 시큐리티를 이용하여 로그인 기능을 처리 할려고 할때 사소하지만 모르면 해결하기가 많이 까다로운 실수 가 있었다.

 

먼저 로그인 기능을 구현하기 위해 User Entity를 만든 뒤 UserDetails를 상속해준다.

@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class User implements UserDetails {

그러면 override를 하게 될텐데 마법사를 통해 override를 자동으로 하게되면 

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

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

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

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

이 부분들이 false로 뜨게 될 것이다.
계정만료여부, 계정 잠김여부, 계정 활성화 여부등을 물어 보는 것인데 이게 false로 되어있으면 로그인을 시도하면 아이디와 비밀번호를 올바르게 입력을 해도 오류가 뜨게 된다.

이런 오류들이 뜨게 되는데 이 오류들은 스프링시큐리티에 의해 인증을 받지 못했을 때 뜨는 오류이다.

이 오류의 해결법은

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

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

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

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

 

userdetails 로부터 override한 메서드들의 반환 값을 true로 바꿔야 한다.

이렇게 하면 로그인이 거절당하는 오류를 해결할 수 있다.

이 오류때문에 정말 많이 해맸다.

원인을 알 수가 없어서 로그인 로직을 처음부터 끝까지 책보고 찾아보다가 겨우 찾았다.

역시 한번 구현한 걸로는 다 알 수가 없다.