본문 바로가기

코딩/Java, SpringBoot

spring boot jwt filter, converter

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;

    }
}