• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

PrincipalDetails, PrincipalDetailsService에 대한 질문

23.06.05 17:34 작성 조회수 936

1

PrincipalDetails

  • 시큐리티가 /login을 낚아채서 로그인을 진행시킨다.

PrincipalDetailsService

  • 시큐리티 설정에서 loginProcessingUrl("/login") 처리

 

이게 view를 리턴하는 방식에서는 formLogin을 처리해줘서 이렇게 여기서 작성하면 controller에서 기능을 구현하지 않아도 login을 시큐리티가 알아서 해주는 걸로 알고 있는데요.

그러면 REST API 방식일때는 SecurityConfig에 formLogin.disable()로 처리하는 걸로 알고 있는데 그러면 PrincipalDetails, PrincipalDetailsService은 REST 방식에서는 작성하지 않는건가요? 근데 그러면 의문이 저 2개의 클래스를 생성하지 않으면

@Data
public class PrincipalDetails implements UserDetails, OAuth2User {

    private  User user;
    private Map<String, Object> attributes;


    // 일반 로그인
    public PrincipalDetails(User user) {
        this.user = user;
    }

    // Oauth 로그인
    public PrincipalDetails(User user, Map<String, Object> attributes) {
        this.user = user;
        this.attributes = attributes;
    }

    // 해당 User의 권한을 리턴하는 곳
    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        Collection<GrantedAuthority> collection = new ArrayList<>();
        collection.add(new GrantedAuthority() {
            @Override
            public String getAuthority() {
                return user.getRole();
            }
        });
        return collection;
    }

    // 사용자의 패스워드를 반환
    @Override
    public String getPassword() {
        return user.getPassword();
    }

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

    // 계정 만료 여부 반환
    @Override
    public boolean isAccountNonExpired() {
        // 만료되었는지 확인하는 로직
        // true = 만료되지 않음
        return true;
    }

    // 계정 잠금 여부 반환
    @Override
    public boolean isAccountNonLocked() {
        // true = 잠금되지 않음
        return true;
    }

    // 패스워드의 만료 여부 반환
    @Override
    public boolean isCredentialsNonExpired() {
        // 패스워드가 만료되었는지 확인하는 로직
        // true = 만료되지 않음
        return true;
    }

    // 계정 사용 가능 여부 반환
    @Override
    public boolean isEnabled() {
        // 계정이 사용 가능한지 확인하는 로직
        // true = 사용 가능
        return true;
    }

    @Override
    public Map<String, Object> getAttributes() {
        return attributes;
    }

    @Override
    public String getName() {
        return null;
    }
}

여기서 UserDtails, OAuth2User을 상속받아서 Override하는 부분은 어떻게 구현하나요?

답변 1

답변을 작성해보세요.

2

구준형님의 프로필

구준형

2023.06.07

제가 아는 선에서 답변해보겠습니다!

일단, formLogin을 사용하겠다는건 기본적인 로그인폼을 이용해서 "세션 기반"의 인증을 하겠다는 겁니다.

formLogin.disable을 한다는 뜻은 세션 기반이 아닌 다른 방식을 사용하겠다는 뜻입니다. e.g. 토큰인증

 

SecurityConfig에서 설정한 로그인 요청 URI에 post 요청이 오면 UserDetailsService의 loadByUsername이 호출돼서 인증이 되면 로그인(및 인증처리할)을 위한 UserDetails를 리턴해주는 형태로 동작합니다.

UserDetails를 세션으로 이용하는것, 토큰으로 이용하는것에 차이기 때문에, UserDetails, UserDetailsService는 작성해야 합니다.

유요한님의 프로필

유요한

질문자

2023.06.07

그렇군요! 감사합니다!