코드 그라데이션
회원 도메인 만들기 본문
스프링 시큐리티 사용하여 인증 인가 구현하기
순서: 회원 엔티티 -> 리포지토리 -> 서비스
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
'SpringBoot [예제] 블로그 만들기 > 시큐리티, JWT 입히기' 카테고리의 다른 글
JWT 서비스 구현하기 (1) | 2023.10.19 |
---|---|
JWT 소개 (0) | 2023.10.18 |
[사전 지식] 토큰 기반 인증 (0) | 2023.10.18 |
시큐리티 설정, 로그인/로그아웃, 회원가입 구현 (0) | 2023.10.17 |
[사전 지식] 스프링 시큐리티 (0) | 2023.10.16 |
Comments