From 5d7b65670282a4fad015e37d567cfa171b162052 Mon Sep 17 00:00:00 2001 From: huliguo <2023611923@qq.com> Date: 星期二, 20 五月 2025 12:25:19 +0800 Subject: [PATCH] 基础代码 --- pt-errand/src/main/java/com/ruoyi/errand/interceptor/APPJwtTokenInterceptor.java | 126 ++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 126 insertions(+), 0 deletions(-) diff --git a/pt-errand/src/main/java/com/ruoyi/errand/interceptor/APPJwtTokenInterceptor.java b/pt-errand/src/main/java/com/ruoyi/errand/interceptor/APPJwtTokenInterceptor.java new file mode 100644 index 0000000..9d25cea --- /dev/null +++ b/pt-errand/src/main/java/com/ruoyi/errand/interceptor/APPJwtTokenInterceptor.java @@ -0,0 +1,126 @@ +package com.ruoyi.errand.interceptor; + + + +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.errand.constant.AppUserStatusConstant; +import com.ruoyi.errand.constant.DelFlagConstant; +import com.ruoyi.errand.domain.AppUser; +import com.ruoyi.errand.mapper.AppUserMapper; +import com.ruoyi.errand.utils.JwtUtil; +import com.ruoyi.errand.utils.TokenBlacklistService; +import com.ruoyi.errand.utils.WeAppAuthenticationToken; +import com.ruoyi.errand.utils.WeAppSecurityProperties; +import io.jsonwebtoken.Claims; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Component; +import org.springframework.util.AntPathMatcher; +import org.springframework.util.PathMatcher; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.Objects; + +/** + * jwt令牌校验的拦截器 + */ +@Component +@Slf4j +public class APPJwtTokenInterceptor extends OncePerRequestFilter { + + @Autowired + private WeAppSecurityProperties weAppSecurityProperties; + @Autowired + private TokenBlacklistService tokenBlacklistService; + + + + @Autowired + private AppUserMapper appUserMapper; + private static final PathMatcher pathMatcher = new AntPathMatcher(); + @Override + protected void doFilterInternal(HttpServletRequest request, + HttpServletResponse response, + FilterChain chain) throws IOException, ServletException { + try { + String path = request.getRequestURI(); + log.info("进入appJwt认证"); + // 检查是否在白名单中 + if (isExcludedPath(path)) { + chain.doFilter(request, response); + return; + } + //不是app开头的也不用校验 + if (!path.startsWith("/app")) { + chain.doFilter(request, response); + return; + } + + + // 从Header提取Token(如:Authorization: WeApp {token}) + String token = request.getHeader("Authorization"); + if (token == null || !token.startsWith("app:")) { + throw new ServiceException("无效token", 401); + } + //解析token 获取userid,再查询到AppUser + String realToken = token.substring(4); + //查看是否在黑名单中 + if (tokenBlacklistService.isBlacklisted(realToken)) { + throw new ServiceException("无效token", 401); + } + try { + + Claims claims = JwtUtil.parseJWT(realToken); + String userId = claims.get("userId").toString(); + AppUser appUser = appUserMapper.selectById(userId); + if (appUser == null || appUser.getDelFlag().equals(DelFlagConstant.DELETE)) { + throw new ServiceException("用户不存在", 401); + } + if (Objects.equals(appUser.getStatus(), AppUserStatusConstant.FREEZE)) { + throw new ServiceException("该账户已被冻结", 401); + } + if (Objects.equals(appUser.getStatus(), AppUserStatusConstant.LOGOUT)) { + throw new ServiceException("该账户已被注销", 401); + } + // 将userId存入SecurityContext(需自定义Authentication对象) + WeAppAuthenticationToken authentication = + new WeAppAuthenticationToken(userId, appUser, token); + SecurityContextHolder.getContext().setAuthentication(authentication); + chain.doFilter(request, response); + } catch (Exception e) { + throw new ServiceException("TOKEN解析失败", 401); + } + }catch (ServiceException e) { + response.setStatus(e.getCode() != null ? e.getCode() : 401); + response.setContentType("application/json;charset=UTF-8"); + response.getWriter().write( + String.format("{\"code\":%d,\"msg\":\"%s\"}", + e.getCode(), e.getMessage()) + ); + return; + }catch (Exception e) { + response.setStatus(401); + response.setContentType("application/json;charset=UTF-8"); + response.getWriter().write( + "{\"code\":500,\"msg\":\"系统内部错误\"}" + ); + return; + } + } + /** + * 判断路径是否在白名单中 + */ + private boolean isExcludedPath(String requestPath) { + return weAppSecurityProperties.getExcludeUrls().stream() + .anyMatch(excludedPath -> + pathMatcher.match(excludedPath, requestPath) + ); + } +} \ No newline at end of file -- Gitblit v1.7.1