나는 프로젝트에 조인 전략을 선택했다.
spring security 와 jpa 상속을 같이 어떻게 쓰는지 고민했는데 그냥 위에 방식대로 사용하면 된다.
@Builder
@Entity
@Getter
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Table(name = "user")
@ApiModel(description = "사용자 상세 정보를 위한 도메인 객체")
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name="type")
public class User implements UserDetails {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Email
@Column(nullable = false, unique = true, length = 100)
private String email;
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
@Column(length = 100)
@ApiModelProperty(notes = "패스워드을 입력해 주세요")
private String password;
@Column(length = 100)
@Size(min = 2, message = "Name은 2글자 이상 입력.")
@ApiModelProperty(notes = "사용자 이름을 입력해 주세요")
private String name;
// @Column(length = 100)
// private String phoneNo;
@Past
@ApiModelProperty(notes = "등록일 정보입니다. 자동으로 입력됩니다.")
private Date joinDate;
@Column(length=100)
private String provider;
@ElementCollection(fetch = FetchType.EAGER)
@Builder.Default
private List<String> roles = new ArrayList<>();
@Column(name = "createdDate")
@ApiModelProperty(notes = "테이블의 생성일 정보입니다. 자동으로 입력됩니다.")
public Date createdDate;
@Column(name = "updatedDate")
@ApiModelProperty(notes = "테이블의 수정일 정보입니다. 자동으로 입력됩니다.")
public Date updatedDate;
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return this.roles.stream().map(SimpleGrantedAuthority::new).collect(Collectors.toList());
}
@PrePersist
void joinDate() {
this.joinDate = this.createdDate = this.updatedDate = new Date();
}
@PreUpdate
void updateDate() {
this.updatedDate = new Date();
}
// json 출력 안함
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
@Override
public String getUsername() {
return this.email;
}
/**
* 아래는
* 로직 추가 작성 필요한 부분
*/
// 계정이 만료가 안됐는지
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
@Override
public boolean isAccountNonExpired() {
return true;
}
// 계정이 잠기지 않았는지
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
@Override
public boolean isAccountNonLocked() {
return true;
}
// 계정 패스워드가 만료 안됐는지
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
@Override
public boolean isCredentialsNonExpired() {
return true;
}
// 계정 사용 가능한지
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
@Override
public boolean isEnabled() {
return true;
}
}
@Entity
@DiscriminatorValue("STORE")
public class Store extends User {
private String s_name;
private String description;
private String addr;
private String s_phone;
}
public interface UserRepository<T extends User> extends JpaRepository<T, Long> {
@Override
Optional<T> findById(Long id);
Optional<T> findByEmail(String email);
Optional<T> findByEmailAndProvider(String email, String provider);
}
https://ict-nroo.tistory.com/128
https://victorydntmd.tistory.com/209
https://stackoverflow.com/questions/51218227/user-class-for-spring-security-application