관리 메뉴

제뉴어리의 모든것

Spring Security 적용시 주의사항.. 본문

Spring Boot/Spring Security

Spring Security 적용시 주의사항..

제뉴어리맨 2021. 4. 8. 00:43

- 에러 상황

기본 로그인폼이 아닌 로그인폼에서 가입시킨

id(username) 와 password를 입력하고 submit 버튼을 눌렀지만 

뭔가 새로고침만 된거같은 느낌으로 페이지가 그대로였다...

콘솔창에서도 엣지의 개발자모드에서도 아무런 에러가 발생되지 않았다.

그나마 크롬에서 submit을 하면 아래의 url로 다시 request를 하였다..

도대체 무슨일인가.. (/member/login 은 커스텀 로그인페이지 url이다)

http://localhost:8080/member/login?error

 

알고보니.. 유저의 entity에서 UserDetails 를 implements 구현하여

Override 해준 메소드를 제대로 정의 안해줘서 그렇다.. (무조건 구현해야하는 추상메소드여서 그냥 내비뒀는데 문제의 원인이였다..)

 

그래서 결국 정의된 Entity는 다음과 같다.

package com.january.springsecurity.entity;

import lombok.*;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import javax.persistence.*;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;

@AllArgsConstructor
@NoArgsConstructor
@Builder
@Entity
@Setter
@ToString
public class Member implements UserDetails {


    @Id
    @Column(length = 10, nullable = false)
    private String id;


    @Column(length = 15, nullable = false)
    private String email;

    @Column(length = 100, nullable = false)
    private String password;

    @Column(length = 100, nullable = false)
    private String auth;



    public String getId() {
        return id;
    }

    public String getEmail() {
        return email;
    }

    public String getAuth() {
        return auth;
    }

    @Override
    public String getPassword() {

        return this.password;
    }

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        HashSet<GrantedAuthority> authSet = new HashSet<>();
        String[] auths = auth.split(",");
        for(String a : auths)
        {
            authSet.add(new SimpleGrantedAuthority(a));
        }
        return authSet;
    }

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

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

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

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

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

- Override 한 각 메소드의 의미

 

User 엔티티는 UserDetails를 상속받아서 구현합니다. UserDetails에서 필수로 구현해야 하는 메소드는 아래와 같습니다.

메소드 이름 설명
getAuthorities() 사용자의 권한을 콜렉션 형태로 반환
(클래스 자료형은 GrantedAuthority를 구현해야함)
getUsername() 사용자의 id를 반환
(id는 unique한 값이여야함)
getPassword() 사용자의 password를 반환
isAccountNonExpired() 계정 만료 여부 반환 (true = 만료되지 않음을 의미)
isAccountNonLocked() 계정 잠금 여부 반환 (true = 잠금되지 않음을 의미)
isCredentialsNonExpired() 패스워드 만료 여부 반환 (true = 만료되지 않음을 의미)
isEnabled() 계정 사용 가능 여부 반환 (true = 사용 가능을 의미)

 

- 주의사항

Entity에 @Getter나 @Data를 써서

위 메소드들과 헷갈리는 경우가 없도록한다..