JWT filter 를 구현해놓았는데 JWT를 안쓰게 되어서 아까워서 남김..
사실상 jjwt의 라이브러리 사용법 정도임.
package pnu.problemsolver.myorder.filter;
import io.jsonwebtoken.Claims;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;
import pnu.problemsolver.myorder.domain.Role;
import pnu.problemsolver.myorder.repository.CustomerRepository;
import pnu.problemsolver.myorder.repository.StoreRepository;
import pnu.problemsolver.myorder.security.JwtTokenProvider;
import pnu.problemsolver.myorder.service.CustomerService;
import pnu.problemsolver.myorder.service.StoreService;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Slf4j
@Component
public class JwtAuthenticationFilter extends OncePerRequestFilter {//filter가 여러번 들어가는 경우도 있어서 인증 처할 때는 OncePerRequestFilter를 사용.
private final JwtTokenProvider tokenProvider;
private final StoreService storeService;
private final CustomerService customerService;
//filter에서도 Bean주입받을 수 있다. 예전에는 이게 안되었기 때문에 안된다고 많이 알고 있다.
@Autowired
public JwtAuthenticationFilter(JwtTokenProvider tokenProvider, StoreService storeService, CustomerService customerService) {
this.tokenProvider = tokenProvider;
this.storeService = storeService;
this.customerService = customerService;
}
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
String jwt = getJwtFromRequest(request); //request에서 jwt 토큰을 꺼낸다.
if (jwt != null && !jwt.isEmpty()) {
if (tokenProvider.isValidate(jwt)) {
Claims claims = tokenProvider.getClaims(jwt);
if (claims.keySet().contains("email")) {
String email = (String) claims.get("email");
//여기오면 로그인 된 상황임.
request.setAttribute("role", Role.MEMBER);
} else {
log.info("email을 찾지 못했습니다.");
}
} else {
log.info("JwtTokenProvider.isValidate()를 통과못함!");
}
} else {
log.info("헤더에 jwt가 없습니다!");
}
request.setAttribute("role", Role.GUEST);//JWT가 있어도 올바르지 않다면 GUEST권한을 부여함.
filterChain.doFilter(request, response); //다음 필터로 넘겨줘야함.
}
//헤더에서 bearer값만 가져온다. 헤더는 Authorization : Bearer {jwtToken} 으로 구성되어 있다.
private String getJwtFromRequest(HttpServletRequest request) {
String bearerToken = request.getHeader("Authorization");
if (bearerToken != null && bearerToken.startsWith("Bearer ")) {//null을 먼저 검사해야함. NPE뜬다.
return bearerToken.substring("Bearer ".length());
}
return null;
}
}
converter도 만들었는데 못쓴다... 깃헙에 놔두기도 애매하고 다음에 참조하자...근데 아래 내용은 필요 없다...
그냥 Converter사용방법 정도...
package pnu.problemsolver.myorder.controller.converter;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.tomcat.util.json.JSONParser;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;
import pnu.problemsolver.myorder.dto.JWTRequest;
import pnu.problemsolver.myorder.domain.MemberType;
import java.lang.annotation.Annotation;
import java.util.Map;
@RequiredArgsConstructor
@Slf4j
@Component
public class StringToJWTRequestConverter implements Converter<String, JWTRequest> {
private final ObjectMapper objectMapper;
@Override
public JWTRequest convert(String source) {
log.info("converter!!");
Map<String, String> map;
try {
map = objectMapper.readValue(source, Map.class);
} catch (JsonProcessingException e) {
log.error("StringToJWTRequestConverter 에러!");
throw new RuntimeException(e);
}
JWTRequest jwtRequest = new JWTRequest();
jwtRequest.setEmail(map.get("email")) ;
log.info(map.get("memberType").toUpperCase());
jwtRequest.setMemberType(MemberType.valueOf(map.get("memberType").toUpperCase()));
return jwtRequest;
}
}
'코딩 > Java, SpringBoot' 카테고리의 다른 글
SpringBoot Map으로 파싱하기. Jackson (0) | 2022.07.19 |
---|---|
springboot OAuth 네이버 아이디로 로그인 (0) | 2022.07.18 |
Spring, JPA, mariadb 시작 에러 (0) | 2022.07.02 |
Gradle build.gradle 버전별 차이 (0) | 2021.12.27 |
[java]필드변수 (0) | 2021.02.09 |