Spring Security (5) 로그인 검증 로직

castle·2023년 12월 28일
0

Security Config에 설정한대로 LoginForm을 통해 날라오는 로그인 요청에 대해 Security가 검증을 하게된다.

UserDetailsServiceUserDetails을 구현해 주어야 DB에 저장된 회원 정보로 부터 아이디 검증을 진행할 수 있다.

UserDetailsService


Spring Security에서 유저의 정보를 가져오는 인터페이스다.

@Service
@RequiredArgsConstructor
public class CustomUserDetailsService implements **UserDetailsService** {

    private final UserRepository userRepository;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

        User userData = userRepository.findByUsername(username);

        if (userData != null) {
            return new CustomUserDetails(userData);
        }
        return null;
    }
}
  • DB에서 유저가 저장되어있는 테이블에 접근하기 위해 UserRepository를 주입해준다.
  • 커스텀 서비스를 만들어 UserDetailsService를 implements해준 후 필수로 구현해야 하는 loadUserByUsername 메서드 를 구현해준다.
    • userData가 null이 아니면 생성자를 통해 CustomUserDetails에 user객체를 담아서 보내준다.

UserDetails


Spring Security에서 사용자 정보를 담는 인터페이스다.

데이터베이스로 부터 특정한 userName에 대한 데이터를 가져오고 해당 데이터를 userDetails 클래스에 넣어서 SecurityConfig에 전달해 주면 SecurityConfig에서 userName에 대한 password, role 들을 검증하고 완료시 스프링 세션에 저장해서 사용자 접근 허용해준다.

→ DTO에 해당하는 역할을 한다.

public class CustomUserDetails implements **UserDetails** {

    private User user;

    public CustomUserDetails(User user){
        this.user = user;
    }

    // 사용자의 특정한 권한에 대해 return 해주는 메서드 (ex role 값)
    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {

        Collection<GrantedAuthority> collection = new ArrayList<>();
        collection.add(new GrantedAuthority() {
            @Override
            public String getAuthority() {
                return user.getUserRole().getValue();
            }
        });
        return collection;
    }

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

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

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

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

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

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

0개의 댓글

관련 채용 정보