Spring Security 연동 (2) (PasswordEncoder, CSRF, logout)
Spring Security 연동 (2) (PasswordEncoder, CSRF, logout)
Spring Security 연동 (1) (프로젝트 생성, 설정, 개념 및 이론) Spring Security 연동 (1) (프로젝트 생성, 설정, 개념 및 이론) 프로젝트 생성 + 설정 Spring Security를 적용시킬 새 프로젝트 club을 다음과 같이
soohykeee.tistory.com
앞서 Security를 위한 설정을 했다면, 이제는 이에 맞는 DB관련 처리가 필요하다.
사용할 ClubMember 엔티티는 다음과 같은 구성으로 만들것이다.
- 이메일 (ID)
- 패스워드
- 이름
- 소셜 가입 여부 (OAuth를 활용-추가 예정)
- 기타 (등록일 / 수정일
회원 권한은 다음과 같다.
- USER : 일반 회원
- MANAGER : 중간 관리 회원
- ADMIN : 총괄 관리자
Entity 추가
entity 디렉토리 생성 후, 하위에 이전에 만들었었던 BaseEntity를 넣어주고, ClubMember 클래스를 생성해준다. 또한 Enum 타입으로 ClubMemberRole 도 생성해준다.
package com.example.club.entity;
public enum ClubMemberRole {
USER, MANAGER, ADMIN
}
package com.example.club.entity;
import lombok.*;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import java.util.HashSet;
import java.util.Set;
@Entity
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Getter
@ToString
public class ClubMember extends BaseEntity {
@Id
private String email;
private String password;
private String name;
private boolean fromSocial;
@ElementCollection(fetch = FetchType.LAZY)
@Builder.Default
private Set<ClubMemberRole> roleSet = new HashSet<>();
public void addMemberRole(ClubMemberRole clubMemberRole) {
roleSet.add(clubMemberRole);
}
}
또한 BaseEntity 사용을 위해 ClubApplication 클래스에 @EnableJpaAuditing 어노테이션을 추가해준다.
@EnableJpaAuditing
@SpringBootApplication
public class ClubApplication {
public static void main(String[] args) {
SpringApplication.run(ClubApplication.class, args);
}
}
해당 Entity 작성 후, 프로그램 실행 시 성공적으로 테이블이 DB에 생성된것을 확인할 수 있다.
Repository 및 더미 데이터 추가
repository 디렉토리 생성 후, 하위에 ClubMemberRepository 인터페이스를 추가해준다.
package com.example.club.repository;
import com.example.club.entity.ClubMember;
import org.springframework.data.jpa.repository.JpaRepository;
public interface ClubMemberRepository extends JpaRepository<ClubMember, String> {
}
ClubMember에 데이터 100개를 추가해주기 위해서 ClubMemberTests 클래스를 추가해준 후, 데이터를 생성해주는 테스트 코드를 작성해 줄 것이다. 또한 비밀번호는 앞서 했던 PasswordEncoder를 이용해서 암호화한 비밀번호를 저장해줄 것이다.
package com.example.club.security;
import com.example.club.entity.ClubMember;
import com.example.club.entity.ClubMemberRole;
import com.example.club.repository.ClubMemberRepository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.security.crypto.password.PasswordEncoder;
import java.util.stream.IntStream;
@SpringBootTest
public class ClubMemberTests {
@Autowired
private ClubMemberRepository clubMemberRepository;
@Autowired
private PasswordEncoder passwordEncoder;
@Test
public void insertDummies() {
// 1 - 80 까지는 ROLE = USER
// 81 - 90 까지는 ROLE = USER, MANAGER
// 91 - 100 까지는 ROLE = USER, MANAGER, ADMIN
IntStream.rangeClosed(1,100).forEach(i -> {
ClubMember clubMember = ClubMember.builder()
.email("user" + i + "@zerock.org")
.name("사용자" + i)
.fromSocial(false)
.password(passwordEncoder.encode("1111"))
.build();
clubMember.addMemberRole(ClubMemberRole.USER);
if (i > 80) {
clubMember.addMemberRole(ClubMemberRole.MANAGER);
}
if (i > 90) {
clubMember.addMemberRole(ClubMemberRole.ADMIN);
}
clubMemberRepository.save(clubMember);
});
}
}
해당 테스트 코드 실행 시, 정상적으로 DB에 더미데이터가 저장되는 것을 확인할 수 있다.
회원데이터 조회 테스트
조회 시에는 사용자의 email을 기준으로 조회하지만, 추후에 추가해줄 소셜 로그인 사용자를 구분하기 위해서 별도 메소드로 추가해준다.
public interface ClubMemberRepository extends JpaRepository<ClubMember, String> {
@EntityGraph(attributePaths = {"roleSet"}, type = EntityGraph.EntityGraphType.LOAD)
@Query("select m from ClubMember m where m.fromSocial =:social and m.email =:email")
Optional<ClubMember> findByEmail(String email, boolean social);
}
@Test
public void testRead() {
Optional<ClubMember> result = clubMemberRepository.findByEmail("user95@zerock.org", false);
ClubMember clubMember = result.get();
System.out.println(clubMember);
}