public class User implements UserDetails 왜함?

박지성 학부생·2023년 11월 22일
1

BackEnd Develop log

목록 보기
5/27

왜 유저 객체를 생성할 때 왜 굳이

@Entity
public class User...

이렇게 안하고 스프링 시큐리티를 사용하여

@Entity
public class User implements UserDetails {

이렇게 하지? 라는 의문이 생겼다. 이걸 implements 하고 안하고는 무슨차이인지?
스프링 시큐리티에서 제공하는 UserDetails객체를 사용하면 자동으로 뭐가 되는건가 싶었다.
쉽고 얕게 차이점을 보니 "아 이래서 사용하는구나" 알게되었다.

UserDetails 인터페이스를 구현하는 것과 구현하지 않는 것의 차이

ex) 온라인 도서관 시스템
UserDetails를 구현하지 않는 경우:
기본 시나리오: 사용자가 온라인 도서관에 로그인할 때, 시스템은 단순히 사용자명과 비밀번호만 확인한다.
제한된 정보: 사용자의 역할(예: 일반 사용자, 관리자), 특별한 권한, 추가적인 사용자 정보(예: 대출한 책 목록) 등을 관리하는 데 제한이 있다.
보안 및 사용자 경험: 사용자의 비밀번호는 암호화되어 있지만, 추가적인 보안 조치나 세부 권한 설정이 어렵다. 또한 사용자에게 맞춤형 서비스를 제공하기 어렵다.

UserDetails를 구현하는 경우:
고급 시나리오: 사용자가 로그인할 때, 시스템은 UserDetails 객체를 사용하여 사용자의 이름, 암호화된 비밀번호, 역할, 권한 등을 확인한다.
맞춤형 정보 관리: 사용자마다 다른 역할(예: 일반 사용자, 관리자)과 권한을 설정할 수 있어, 관리자는 도서 추가/삭제 등의 관리 작업을 할 수 있고, 일반 사용자는 도서 대출 및 반납만 할 수 있다.
개선된 보안 및 사용자 경험: UserDetails를 통해 보다 정교한 보안 정책을 적용할 수 있다. 예를 들어, 특정 권한을 가진 사용자만 특정 자료를 열람할 수 있게 한다. 또한 사용자의 활동에 따라 맞춤형 추천 도서 목록을 제공할 수 있다.

결론:
아 그래서 뭐가 다르다는거야?
=> implements UserDetails 하면 @Override 돼있는 아래와 같은 함수 꽁으로 사용가능 => 이것들로 디테일한 유저정보 관리가능!(이게 핵심) => 아~ 디테일하게 유저 관리하는 메소드 따로 안만들고 편하게 사용하려고 'implements UserDetails' 하는구나!

// @Override 된 메소드 사용가능
@Table(name = "users")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@Entity
public class User implements UserDetails {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", updatable = false)
    private Long id;

    @Column(name = "email", nullable = false, unique = true)
    private String email;

    @Column(name = "password")
    private String password;

    @Column(name = "nickname", unique = true)
    private String nickname;

    @Builder
    public User(String email, String password, String nickname) {
        this.email = email;
        this.password = password;
        this.nickname = nickname;
    }

    public User update(String nickname) {
        this.nickname = nickname;

        return this;
    }


    /*
    getAuthorities(): 사용자가 시스템에서 어떤 일을 할 수 있는지 결정하는 '키'와 같은 역할
     ex) 사용자가 어떤 페이지를 볼 수 있거나, 어떤 작업을 수행할 수 있는지를 결정하는 데 사용
        ex) 온라인 쇼핑몰 시스템: 사용자가 로그인하면, 시스템은 getAuthorities()를 호출 => 이 사용자에게 어떤 권한이 있는지 확인
    코드에서 return List.of(new SimpleGrantedAuthority("user"));는 이 사용자가 '일반 사용자(user)' 권한을 가지고 있음을 나타냄
    '일반 사용자' 권한을 가진 사람은 쇼핑몰에서 쇼핑을 할 수 있지만, 상품을 추가하거나 가격을 변경하는 등의 관리자 기능은 사용할 수 없음
    즉, getAuthorities() 메서드는 사용자가 시스템 내에서 할 수 있는 일의 '범위'를 정의
    이를 통해 어떤 사용자가 특정 기능을 사용할 수 있는지, 또는 특정 페이지에 접근할 수 있는지를 시스템이 결정할 수 있게 해줌
    */
    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return List.of(new SimpleGrantedAuthority("user"));
    }

    @Override
    public String getUsername() {
        return email;
    }

    @Override
    public String getPassword() {
        return password;
    }

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

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

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

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

눈으로 확인

엔티티에 id, email, password, nickname 필드만 넣었지만 그 외의 속성들이 알아서 관리됨

profile
참 되게 살자

0개의 댓글