1. UserDetails 인터페이스를 구현하는 엔터티 클래스 생성
1) domain 패키지 하위의 Member 클래스 파일 수정
(1) 클래스 선언 부분에 UserDetails 인터페이스 구현 추가
(2) UserDetails 인터페이스의 추상 메서드 구현
2. UserDetailsService 인터페이스 구현하는 서비스 클래스 생성
1) config 패키지 하위의 SecurityConfig 클래스 파일 수정
2) service 패키지 하위에 MemberService 클래스 파일 생성
* 스프링 시큐리티에서는 필터들이 UserDetails 인터페이스와 UserDetailsService 인터페이스가 구현되어 있다고 간주하고 메서드를 사용한다.
* 구현한 객체를 어떻게 찾느냐? 스프링 컨테이너에 등록되어있는 컴포넌트(객체, bean)를 주입시켜준다.
※ Optional 클래스 메서드 참고
- isEmpty() : Optional 객체가 비어있으면 true
- isPresent() : Optional 객체 안에 원소가 들어있으면 true
3) 로그인을 할 때 콘솔에 출력되는 로그를 보면, MemberService에 구현한 메서드를 사용하는 것을 확인할 수 있다.
※ 스프링 시큐리티를 사용하면 접근 권한이 없는 사용자는 403에러를 받게 된다.
※ 스프링 시큐리티 의존성
- 로그인/로그아웃을 간편하게 사용할 수 있게 됨.
- 타임리프 스프링 시큐리티 의존성도 추가해야함.
※ 스프링 시큐리티를 사용하려면 반드시 필요한 것들.
1) config 파일을 만들어줘야함 - 인코더, 필터체인 반드시 구현해줘야함
2) 유저 상세 정보를 구현하고 있는 클래스 있어야함(UserDetails)
3) 유저 상세 정보 서비스를 구현하고 있는 클래스도 있어야함(UserDetailsService)
3. 회원가입 기능 작성
1) MemberController 클래스 파일에 코드 추가
2) dto 패키지 하위에 MemberSignUpDto 클래스 파일 생성
3) MemberService 클래스 파일에 코드 추가
* org.springframework.transaction.annotation.Transactional 애너테이션을 추가해야함(동명의 애너테이션이 있으니 주의)
※ CSRF(Cross Site Request Forgery)
- 크로스 사이트를 사용한 해킹 공격을 방지하기 위한 기능(스프링 시큐리티에서는 기본적으로 enable 되어있음)
- 서버에서 CSRF키를 보내주고 브라우저에서 받은 CSRF키를 다시 보내줘야 정상적으로 작동함.
- Ajax 요청을 처리할 때도 CSRF가 enable 되어있는 경우 CSRF키를 보내줘야 함.
-------------------------------------------------------------------------------------
테이블 <=> 연관 테이블(예: Members <=> Member_Roles)
member_roles의 엔터티를 따로 만들지는 않았음..
연관 테이블 정보를 가져올 수 있도록 Set으로 정의를 했음..왜냐면 권한이 1개 이상 있을 수 있기 때문에.
연관 테이블의 엔터티 클래스 없이 사용할 때는 @ElementCollection
Enum을 사용할 때는 @Enumerated
컨트롤러에서 @PreAuthorize 애너테이션을 사용해서 hasRole 속성을 줬기 때문에, findByUsername() 메서드는 효율성을 고려해서 EAGER 방식으로 동작하도록 설정.