인증 주체를 나타낼
JwtAuthenticationToken
클래스를 만들 것이다.
package com.august.soil.api.security;
security
패키지 아래에 만든다.import lombok.AllArgsConstructor;
import lombok.Getter;
import org.apache.commons.lang3.builder.ToStringStyle;
import static org.apache.commons.lang3.builder.ToStringBuilder.*;
@Getter
@AllArgsConstructor
public class AuthenticationRequest {
private String principal;
private String credentials;
protected AuthenticationRequest() {}
@Override
public String toString() {
return reflectionToString(this, ToStringStyle.JSON_STYLE);
}
}
import lombok.Getter;
import org.springframework.security.authentication.AbstractAuthenticationToken;
@Getter
public class JwtAuthenticationToken extends AbstractAuthenticationToken {
private final Object principal;
private String credentials;
}
AbstractAuthenticationToken
을 상속한 클래스를 생성한다. principal
필드에 저장된다. 그런데 왜 모든 객체의 조상인 Object
타입일까?그 이유는 로그인 전과 로그인 후의 인증 주체의 타입이 다르기 때문이다.
로그인 전에는 이메일 주소로만 인증과정을 진행할 것이기 때문에String
타입이면 충분하지만, 로그인 후에는 이메일 주소 외에도 DB 테이블의 PK값, 사용자 이름 등의 추가 정보를 함께 저장할 필요가 생기고 그러기 위해 지난 포스트에서 만든JwtAuthentication
타입 객체를principal
로 사용하게 된다.
getter
도 만들어 준다.import lombok.Getter;
import org.springframework.security.authentication.AbstractAuthenticationToken;
import org.springframework.security.core.GrantedAuthority;
import java.util.Collection;
@Getter
public class JwtAuthenticationToken extends AbstractAuthenticationToken {
...
// 로그인 전에 사용할 것
public JwtAuthenticationToken(Object principal, String credentials) {
super(null);
super.setAuthenticated(false);
this.principal = principal;
this.credentials = credentials;
}
// 로그인 후에 사용할 것
JwtAuthenticationToken(Object principal, String credentials, Collection<? extends GrantedAuthority> authorities) {
super(authorities);
super.setAuthenticated(true);
this.principal = principal;
this.credentials = credentials;
}
}
import lombok.Getter;
import org.springframework.security.authentication.AbstractAuthenticationToken;
import org.springframework.security.core.GrantedAuthority;
import java.util.Collection;
@Getter
public class JwtAuthenticationToken extends AbstractAuthenticationToken {
...
AuthenticationRequest authenticationRequest() {
return new AuthenticationRequest(String.valueOf(principal), credentials);
}
}
AuthenticationRequest
를 생성하는 메서드를 작성한다. import lombok.Getter;
import org.springframework.security.authentication.AbstractAuthenticationToken;
import org.springframework.security.core.GrantedAuthority;
import java.util.Collection;
@Getter
public class JwtAuthenticationToken extends AbstractAuthenticationToken {
...
public void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException {
if (isAuthenticated) {
throw new IllegalArgumentException("Cannot set this token to trusted - use constructor which takes a GrantedAuthority list instead");
}
super.setAuthenticated(false);
}
}
import lombok.Getter;
import org.springframework.security.authentication.AbstractAuthenticationToken;
import org.springframework.security.core.GrantedAuthority;
import java.util.Collection;
import org.apache.commons.lang3.builder.ToStringStyle;
import static org.apache.commons.lang3.builder.ToStringBuilder.reflectionToString;
@Getter
public class JwtAuthenticationToken extends AbstractAuthenticationToken {
...
@Override
public void eraseCredentials() {
super.eraseCredentials();
this.credentials = null;
}
@Override
public String toString() {
return reflectionToString(this, ToStringStyle.JSON_STYLE);
}
}
다음 포스트에서 계속...