프로젝트를 위한 JPA처리

Shaun·2021년 8월 16일
0

Spring Security

목록 보기
4/19

스프링 시큐리티를 적용하기 위해서는 당연히 이에 맞는 데이버테이스 관련 처리도 필요하다.

예제는 저번에 사용했던 BaseEntity와 이메일을 아이디로 구성해서 회원 엔티티를 만들어준다.

기본세팅은 이러하다.

  • 이번 예제에서는 회원 한명이 여러 권한을 가진다는 설정이다.

  • clubMemberRole 는 열거형으로 권한에 대한 처리이다.

  • clubMember 와 clubMemberRole 1:n관계이다.

  • clubMemberRole 타입을 처리 하기위해 clubMember테이블에 메서드를 추가 해준다.

TEST / Repository에 더미네이터 추가

  • db저장을 위한 레파지토리 autowired와 패스워드를 인코드 해서 db에 넣어야 하므로 passowrdEncoder도 선언해준다.
  • 열거형.상수이름

  • clubMemberRole 는 엔티티가 아니라는걸 잊지말자.

회원데이터 조회 테스트

EntityGraph란

  • 엔티티들은 서로 연관되어 있는 관계가 보통이며 이 관계는 그래프로 표현이 가능합니다. EntityGraph는 JPA가 어떤 엔티티를 불러올 때 이 엔티티와 관계된 엔티티를 불러올 것인지에 대한 정보를 제공한다
  • FetchType.LAZY 와 FetchType.EAGER로 연관 엔티티를 가져올 것인지를 결정할 수 있습니다. 하지만 이 구문은 정적이며 런타임 시 이 설정을 변경하지 못하는 단점이 있었습니다. EntityGraph는 이러한 점을 보완하고 연관 엔티티를 어떻게 로딩할 것인지에 대한 정보를 제공함으로서 엔티티 로딩 속도를 높일 수 있는 장점이 있습니다.

시큐리티를 위한 UserDetailsService

(회원 처리부분)

중요한 포인트만 요약하겠다.

  • 스프링 시큐리티에서는 회원 이나 계정에 대해서 User라는 용어를 사용한다.
  • 회원id라는 용어대신 username이라는 단어를 사용한다. username이라는 단어 자체가 회원을 구별할 수 있는 식별 데이터를 의미한다.
  • username과 password를 동시에 사용하지 않는다. UserDetailsService를 이용해 회원 존재만을 우선적으로 가져오고 이후에 password가 틀리면 Bad Cridentail이라는 결과를 만들어 낸다.
  • username 과 password로 1)인증 과정이 끝나면 2)자원(URL)에 접근할수 있는 권한이 있는지 확인 후 3) 인가 과정 실행. 이 과정에서 'Access Denined' 결과 나올수 있다.

가장 핵심부분은 UserDetailsService 이다. 이 녀석은 loadUserByUserName()이라는 메서드 하나만 가진다.

UserDetails 인터페이스

loadUserByUserName() 는 리턴 타입은 UserDetails 라는 타입인데 이를 통해 다음과 같은 정보를 알아 낼수있다.

  • getAuthorities()- 사용자가 가지는 권한에 대한정보
  • getPassword() - 인증을 마무리하기 위한 패스워드 정보
  • getUserName() - 인증에 필요한 아이디와 같은 정보

UserDeTails 인터페이스를 구현한 클래스 들이다. (우리는 4번 사용예정)

1.InterOrgPerson
2.LoadUserDetailsImpl
3.Person
4.User

  • 패키지를 생성하고 ClubAuthMemberDTO 를 생성해준다.

  • User 클래스를 상속하고 User 클래스의 생성자를 호출할 수 있는 코드를 만든다.

  • DTO는 DTO 역활을 수행하는 클래스인 동시에 스프링 시큐리티 인증/인가 작업에도 사용할 수 있다.

UserDetailsService 구현

  • ClubMember 가 ClubAuthMebmerDTO라는 타입으로 처리되는 이유는 사용자의 정보를 가져오는 핵심점 역활을 하는 UserDetailsService 떄문이다.

  • 인증을 담당하는 AuthenticationManager은 내부적으로 UserDetailsService을 호출해서 사용자 정보를 가져온다.

SecurityConfig 클래스 변경

  • ClubUserDetailsService 가 으로 등록 되면 이를 자동으로 스프링 시큐리티에서 userDetailsService로 인식하기 떄문에 configure(AuthenticationManagerBuider auth)부분을 사용하지 않도록 수정한다.

ClubMemberRepository 연동

ClubUserDetailsService 와 clubMemberRepository 를 연동 시켜준다.

  • username 은 실제로는 clubMember의 email을 의미한다.
  • clubMember 을 UserDetails 타입으로 처기하리기위해 DTO로 변환
  • ClubMemberRole는 스프링 시큐리티에서 사용하는SimpleGrantedAuthority로 변환 'Role_'라는 접두어를 추가해서 사용한다.
profile
호주쉐프에서 개발자까지..

0개의 댓글