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를 써서
위 메소드들과 헷갈리는 경우가 없도록한다..