module-admin → [AdminFIlter]
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String path = exchange.getRequest().getPath().toString();
System.out.println("path = " + path);
String authorizationHeader = exchange.getRequest().getHeaders().getFirst("Authorization");
if (authorizationHeader == null || !authorizationHeader.startsWith("Bearer ")) {
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
String token = authorizationHeader.substring(7);
String role = jwtUtil.getRole(token);
if (!"ROLE_ADMIN".equals(role) || !"ROLE_SUPER_ADMIN".equals(role)) {
exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);
}
Spring Cloud Gateway를 사용할 때 Admin 필터를 사용하여 jwt토큰의 role 클레임이 "ROLE_ADMIN"인지 검증한다.
그러면 어짜피 jwt토큰만 발급받으면 되는데 사용자 로그인 API와 어드민 로그인 API를 따로 구현할 필요가 있나하는 의문점...!
일단 내가 이해하는 방식이다.
↓ ↓ ↓
1. User: login 요청
2. SCG를 통해 인증 서버에 로그인 API 요청
3. 인증 서버에서 JWT 토큰 발급
4. User: 유저 조회 요청
5. User의 토큰으로 SCG의 Authentication Filter 통과 후 User 서버에서 유저 조회 API 요청
6. 유저 정보 응답 받음
7. User: 어드민 기능 요청
8. SCG의 Admin FIlter에 의해 해당 요청이 Admin 서버로 가지않음
9. 예외 응답
10. Admin: 로그인 API 요청
11. role: ROLE_ADMIN으로 설정된 JWT 토큰 응답
12. 해당 JWT 토큰으로 SCG의 Admin FIlter 통과
13. 성공적으로 Admin 서버 접근
괜찮은 것 같은데 ? ? 왜 사용자와 어드민의 로그인 API가 달라야할까 ? ?!!
도와줘 챗찌핕티@@!
오 .. 오.. 지금은 개발 단계라 필요없어보이긴하지만 .. . 확장성/ 유지보수성/ 보안강화같은게 있구나..
일단 API 분리해놓는걸루 ~ ㅎ
'개발' 카테고리의 다른 글
[스프링부트] LazyInitializationException 지연 로딩 오류 (0) | 2024.09.12 |
---|---|
[스프링부트] 탈퇴 회원 처리 (Postgres DB 분리, @Scheduled) (0) | 2024.09.10 |
[Spring Cloud Gateway] module-admin (0) | 2024.09.09 |
[Springboot + Redis + CoolSms] 회원가입 인증 부분 문제 해결 (0) | 2024.09.06 |
[Spring Cloud Gateway] 로그아웃 확인 (0) | 2024.09.05 |