본 프로젝트는 “스프링부트 3 백엔드 개발자 되기” 서적을 참고하여 진행하였음
회원 도메인 만들기
•
의존성 추가하기
dependencies {
... 생략 ...
// 스프링 시큐리티 사용하기 위한 스타터 추가
implementation 'org.springframework.boot:spring-boot-starter-security'
// 타임리프에서 스프링 시큐리티 사용하기 위한 의존성 추가
implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6'
// 스프링 시큐리티를 테스트하기 위한 의존성 추가
implementation 'org.springframework.security:spring-security-test'
}
Java
복사
•
회원 엔티티 만들기
Table
Search
•
domain 패키지에 UserDetail 클래스를 상속하는 User 클래스 생성
package com.example.msblog.domain;
import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import java.util.Collection;
import java.util.List;
@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;
@Builder
public User(String email, String password, String auth) {
this.email = email;
this.password = password;
}
@Override // 권한 반환, 사용자 이외의 권한이 없기 때문에 user 권한만 담아 반환
public Collection<? extends GrantedAuthority> getAuthorities() {
return List.of(new SimpleGrantedAuthority("user"));
}
// 사용자의 패스워드 반환
@Override
public String getPassword() {
return password;
}
// 사용자 id를 반환 (고유값)
@Override
public String getUsername() {
return email;
}
// 계정 만료 여부 반환
@Override
public boolean isAccountNonExpired() {
return true; // 만료되었는지 확인 (true -> 만료되지 않았음)
}
// 계정 잠금 여부 반환
@Override
public boolean isAccountNonLocked() {
return true; // 계정 잠금되었는지 확인 (true -> 잠금되지 않았음)
}
// 패스워드 만료 여부 반환
@Override
public boolean isCredentialsNonExpired() {
return true; // 패스워드가 만료되었는지 확인 (true -> 만료되지 않았음)
}
// 계정 사용 가능 여부 반환
@Override
public boolean isEnabled() {
return true; // true -> 사용 가능
}
}
Java
복사
•
UserRepository 생성
package com.example.msblog.repository;
import com.example.msblog.domain.User;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.Optional;
public interface UserRepository extends JpaRepository<User, Long> {
Optional<User> findByEmail(String email); // email로 사용자 정보를 가져옴 -> FROM users WHERE email = #{email}
}
Java
복사
•
서비스 코드 작성
package com.example.msblog.service;
import com.example.msblog.repository.UserRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.stereotype.Service;
// 사용자 정보 가져오는 UserDetailService 인터페이스 구현
@RequiredArgsConstructor
@Service
public class UserDetailService implements UserDetailsService {
private final UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String email) {
return userRepository.findByEmail(email)
.orElseThrow(() -> new IllegalArgumentException(email)); // 사용자 정보 가져옴
}
}
Java
복사