이전 포스팅에 이어서...
외부와의 통신에 사용할 DTO 클래스 생성
dto > LoginDto.java
dto > TockenDto.java
dto > UserDto.java
Repository 관련 코드 생성
- JpaRepository를 extends 하여 findall, save 등의 메소드를 기본적으로 사용한다.
repository > (I) UserRepository.java
- @EntityGraph : 쿼리가 수행될 때 Eager 조회로 attributePaths 정보를 같이 가져온다.
관련 로직 생성
service > CustomUserDetailsService.java
- Spring Security에서 중요한 부분인 UserDetailsService를 구현
- UserDetailsService 를 implements 하고 UserRepository를 주입받는다.
- loadUserByUsername 메소드를 오버라이드하여 로그인 시 DB에서 유저정보와 권한정보를 가져온다. 해당 정보를 기반으로 userdetails.User 객체를 생성해서 리턴
로그인 API 생성
contloller > AuthController.java
- TockenProvider, AuthenticationManagerBuilder를 주입받는다.
- @PostMapping("/authenticate")
- 로그인 API 경로는 /api/authenticate이고 post 요청을 받는다.
- LoginDto의 username, password를 통해 UsernamePasswordAuthenticationToken을 생성한다.
- Authentication객체를 생성하고 이를 SecurityContext에 저장한다.
- createToken() : Authentication 객체를 통해 JWT Token 생성
- JWT Token을 Response Header에도 넣고, TokenDto를 이용하여 Body에도 넣어 return
확인 시 토큰이 정상적으로 리턴돼야한다
POST http://localhost:8080/api/authenticate
Request Body
{"username":"admin", "password":"admin"}
회원가입 API 생성
utll > SecurityUtil.java
- getCurrentUsername() : Security Context의 Authentication 객체를 이용해 username을 리턴해주는 간단한 유틸성 메소드
service > UserService.java
- UserRepository, PasswordEncoder를 주입받는다.
- signup() : 회원가입 로직 수행
- username 이 DB에 존재하지 않으면 Autority와 User 정보를 생성하여 save메소드를 통해 DB에 저장
controller > UserController.java
- @PostMapping("/signup")
- @GetMapping("/user") @PreAuthrize("hasAnyRole('USER', 'ADMIN')") : USER, ADMIN 권한 호출 허용
- @GetMapping("/user/{username}") @PreAuthrize("hasAnyRole('ADMIN')") : ADMIN 권한만 호출 허용
회원가입 API 실행하기
POST http://localhost:8080/api/signup
{"username":"a1", "password":"a1", "nickname":"nickname"}
h2-console로 DB 확인
권한검증까지 호출해보면
완료!!!
참고
본문 내용 강의
[무료] Spring Boot JWT Tutorial - 인프런 | 강의
Spring Boot, Spring Security, JWT를 이용한 튜토리얼을 통해 인증과 인가에 대한 기초 지식을 쉽고 빠르게 학습할 수 있습니다., - 강의 소개 | 인프런
www.inflearn.com
강의 Git
GitHub - SilverNine/spring-boot-jwt-tutorial
Contribute to SilverNine/spring-boot-jwt-tutorial development by creating an account on GitHub.
github.com
댓글