스프링 시큐리티를 적용하기 위해서는 당연히 이에 맞는 데이버테이스 관련 처리도 필요하다.
예제는 저번에 사용했던 BaseEntity와 이메일을 아이디로 구성해서 회원 엔티티를 만들어준다.
기본세팅은 이러하다.
이번 예제에서는 회원 한명이 여러 권한을 가진다는 설정이다.
clubMemberRole 는 열거형으로 권한에 대한 처리이다.
clubMember 와 clubMemberRole 1:n관계이다.
열거형.상수이름
clubMemberRole 는 엔티티가 아니라는걸 잊지말자.
EntityGraph란
- 엔티티들은 서로 연관되어 있는 관계가 보통이며 이 관계는 그래프로 표현이 가능합니다. EntityGraph는 JPA가 어떤 엔티티를 불러올 때 이 엔티티와 관계된 엔티티를 불러올 것인지에 대한 정보를 제공한다
- FetchType.LAZY 와 FetchType.EAGER로 연관 엔티티를 가져올 것인지를 결정할 수 있습니다. 하지만 이 구문은 정적이며 런타임 시 이 설정을 변경하지 못하는 단점이 있었습니다. EntityGraph는 이러한 점을 보완하고 연관 엔티티를 어떻게 로딩할 것인지에 대한 정보를 제공함으로서 엔티티 로딩 속도를 높일 수 있는 장점이 있습니다.
중요한 포인트만 요약하겠다.
- 스프링 시큐리티에서는 회원 이나 계정에 대해서 User라는 용어를 사용한다.
- 회원id라는 용어대신 username이라는 단어를 사용한다. username이라는 단어 자체가 회원을 구별할 수 있는 식별 데이터를 의미한다.
- username과 password를 동시에 사용하지 않는다. UserDetailsService를 이용해 회원 존재만을 우선적으로 가져오고 이후에 password가 틀리면 Bad Cridentail이라는 결과를 만들어 낸다.
- username 과 password로 1)인증 과정이 끝나면 2)자원(URL)에 접근할수 있는 권한이 있는지 확인 후 3) 인가 과정 실행. 이 과정에서 'Access Denined' 결과 나올수 있다.
가장 핵심부분은 UserDetailsService 이다. 이 녀석은 loadUserByUserName()이라는 메서드 하나만 가진다.
loadUserByUserName() 는 리턴 타입은 UserDetails 라는 타입인데 이를 통해 다음과 같은 정보를 알아 낼수있다.
- getAuthorities()- 사용자가 가지는 권한에 대한정보
- getPassword() - 인증을 마무리하기 위한 패스워드 정보
- getUserName() - 인증에 필요한 아이디와 같은 정보
UserDeTails 인터페이스를 구현한 클래스 들이다. (우리는 4번 사용예정)
1.InterOrgPerson
2.LoadUserDetailsImpl
3.Person
4.User
패키지를 생성하고 ClubAuthMemberDTO 를 생성해준다.
User 클래스를 상속하고 User 클래스의 생성자를 호출할 수 있는 코드를 만든다.
ClubMember 가 ClubAuthMebmerDTO라는 타입으로 처리되는 이유는 사용자의 정보를 가져오는 핵심점 역활을 하는 UserDetailsService 떄문이다.
인증을 담당하는 AuthenticationManager은 내부적으로 UserDetailsService을 호출해서 사용자 정보를 가져온다.
ClubUserDetailsService 와 clubMemberRepository 를 연동 시켜준다.