From 6bcbe72b43d6fa041d06878d1dae09a6d8903895 Mon Sep 17 00:00:00 2001 From: jack <jack.su@pollex.com.tw> Date: 星期五, 11 八月 2023 16:19:02 +0800 Subject: [PATCH] [ADD] 為了解決滲透測試JWT token 登出未失效問題, 在登出後會需要建立黑名單並在filter中確定token是否非黑名單 --- pamapi/src/main/java/com/pollex/pam/security/jwt/JWTFilter.java | 24 +++++++++++++++++++++++- 1 files changed, 23 insertions(+), 1 deletions(-) diff --git a/pamapi/src/main/java/com/pollex/pam/security/jwt/JWTFilter.java b/pamapi/src/main/java/com/pollex/pam/security/jwt/JWTFilter.java index a574659..7e3a0b9 100644 --- a/pamapi/src/main/java/com/pollex/pam/security/jwt/JWTFilter.java +++ b/pamapi/src/main/java/com/pollex/pam/security/jwt/JWTFilter.java @@ -1,15 +1,24 @@ package com.pollex.pam.security.jwt; import java.io.IOException; +import java.util.Optional; + import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import org.springframework.web.filter.GenericFilterBean; + +import com.pollex.pam.business.domain.TokenBlackList; +import com.pollex.pam.business.repository.TokenBlackListRepository; /** * Filters incoming requests and installs a Spring Security principal if a header corresponding to a valid user is @@ -22,6 +31,7 @@ public static final String AUTHORIZATION_TOKEN = "access_token"; private final TokenProvider tokenProvider; + public JWTFilter(TokenProvider tokenProvider) { this.tokenProvider = tokenProvider; @@ -32,19 +42,31 @@ throws IOException, ServletException { HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; String jwt = resolveToken(httpServletRequest); + if(StringUtils.hasText(jwt) && !jwt.equals("null")) { + boolean isBlackToken = this.tokenProvider.isBlackListToken(jwt); + if(isBlackToken) { + HttpServletResponse response = (HttpServletResponse) servletResponse; + response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + } + } + if (StringUtils.hasText(jwt) && this.tokenProvider.validateToken(jwt)) { - Authentication authentication = this.tokenProvider.getAuthentication(jwt); + + Authentication authentication = this.tokenProvider.getAuthentication(jwt); SecurityContextHolder.getContext().setAuthentication(authentication); } + filterChain.doFilter(servletRequest, servletResponse); } private String resolveToken(HttpServletRequest request) { + String bearerToken = request.getHeader(AUTHORIZATION_HEADER); if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) { return bearerToken.substring(7); } String jwt = request.getParameter(AUTHORIZATION_TOKEN); + if (StringUtils.hasText(jwt)) { return jwt; } -- Gitblit v1.8.0