코드 그라데이션

회원 도메인 만들기 본문

SpringBoot [예제] 블로그 만들기/시큐리티, JWT 입히기

회원 도메인 만들기

완벽한 장면 2023. 10. 17. 21:59

스프링 시큐리티 사용하여 인증 인가 구현하기

순서: 회원 엔티티 -> 리포지토리 -> 서비스

 

1. 의존성 추가

build.gradle

dependencies {
	// 스프링 시큐리티를 사용하기 위한 스타터 추가
	implementation 'org.springframework.boot:spring-boot-starter-security'
	// 타임리프에서 스프링 시큐리티를 사용하기 위한 의존성 추가
	implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6'
	// 스프링 시큐리티를 테스트하기 위한 의존성 추가
	testimplementation 'org.springframework.security:spring-security-test'
}

 

2. 엔티티 만들기

개요

 

domain.User.java

@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") // OAuth 쓰면서 nullable = false 속성 삭제
    private String password;


    // 사용자 이름
    @Column(name = "nickname", unique = true)
    private String nickname;


    @Builder
    public User(String email, String password, String nickname) {
        this.email = email;
        this.password = password;
        this.nickname = nickname; // 추가
    }


    @Override // 권한 반환
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return List.of(new SimpleGrantedAuthority("user"));
    }

    @Override // 고유한 값 - 사용자의 id를 반환
    public String getUsername() {
        return email;
    }

    @Override  // 사용자의 패스워드를 반환
    public String getPassword() {
        return password;
    }

    @Override // 계정 만료 여부 반환
    public boolean isAccountNonExpired() {  // 만료되었는지 확인하는 로직
        return true; // true -> 유효한 상태임
    }

    @Override // 계정 잠금 여부 반환
    public boolean isAccountNonLocked() { //계정이 잠겼는지 확인하는 로직
        return true; // 잠기지 않았음
    }

    @Override // 패스워드의 만료 여부 반환
    public boolean isCredentialsNonExpired() {  // 패스워드가 만료되었는지 확인하는 로직
        return true; // 만료되지 않았음(true)
    }

    @Override // 계정 사용 가능 여부 반환
    public boolean isEnabled() { // 계정이 사용 가능한지 확인하는 로직
        return true; // 사용 가능(true)
    }

}

 

필수 오버라이드 메서드 설명

 

 

3. 리포지토리 만들기

repository.UserRepository.java

- 이메일로 사용자 정보 식별. 이게 사용자 이름.

- 따라서 정보를 가져오기 위해서는 스프링 시큐리티가 이메일을 전달받아야 함.

public interface UserRepository extends JpaRepository<User, Long> {
    Optional<User> findByEmail(String email);
}

 

실제 데이터베이스에 회원 정보를 요청할 때 JPA는 이 형태로 쿼리 실행

FROM USERS
WHERE email = #{email};

 

자주 사용하는 쿼리 메서드의 명명 규칙

 

4. 서비스 코드 구현

UserDetailService.java

// 스프링 시큐리티에서 사용자 정보를 가져오는 인터페이스
@RequiredArgsConstructor
@Service
public class UserDetailService implements UserDetailsService {

    private final UserRepository userRepository;

    @Override
    public User loadUserByUsername(String email) {
        return userRepository.findByEmail(email)
                .orElseThrow(() -> new IllegalArgumentException((email)));
    }
}
728x90
Comments