fix: 修复发布作品接口登录状态检查bug - JwtAuthInterceptor添加可选认证路径支持 - WebConfig移除/work/*模式避免误排除/work/publish

This commit is contained in:
2026-02-13 18:02:47 +08:00
parent cace369da2
commit 3e59fb0aac
2 changed files with 24 additions and 2 deletions

View File

@@ -116,6 +116,7 @@ public class WebConfig implements WebMvcConfigurer {
.order(2); .order(2);
// JWT 认证拦截器(小程序用户) // JWT 认证拦截器(小程序用户)
// 注:/work/{id} 详情页面的可选认证已在拦截器内部通过正则匹配处理
registry.addInterceptor(jwtAuthInterceptor) registry.addInterceptor(jwtAuthInterceptor)
.addPathPatterns("/**") .addPathPatterns("/**")
// 排除不需要认证的接口 // 排除不需要认证的接口
@@ -126,8 +127,9 @@ public class WebConfig implements WebMvcConfigurer {
"/user/check", "/user/check",
"/user/wx-login", "/user/wx-login",
"/user/refresh-token", "/user/refresh-token",
// 公开接口 - 作品相关(/work/*匹配/work/{id}和/work/list不匹配/work/{id}/like // 公开接口 - 作品列表和分类
"/work/*", "/work/list",
"/work/categories",
// 分类和Banner // 分类和Banner
"/category/**", "/category/**",
"/banner/**", "/banner/**",

View File

@@ -21,12 +21,23 @@ public class JwtAuthInterceptor implements HandlerInterceptor {
private final JwtUtil jwtUtil; private final JwtUtil jwtUtil;
// 公开路径可选认证有token则解析无token也放行
private static final java.util.regex.Pattern OPTIONAL_AUTH_PATTERN =
java.util.regex.Pattern.compile("^/work/\\d+$");
@Override @Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String requestURI = request.getRequestURI();
boolean isOptionalAuthPath = OPTIONAL_AUTH_PATTERN.matcher(requestURI).matches();
// 从请求头获取token // 从请求头获取token
String authHeader = request.getHeader("Authorization"); String authHeader = request.getHeader("Authorization");
if (authHeader == null || !authHeader.startsWith("Bearer ")) { if (authHeader == null || !authHeader.startsWith("Bearer ")) {
// 可选认证路径无token也放行
if (isOptionalAuthPath) {
return true;
}
sendError(response, HttpServletResponse.SC_UNAUTHORIZED, "未提供认证令牌"); sendError(response, HttpServletResponse.SC_UNAUTHORIZED, "未提供认证令牌");
return false; return false;
} }
@@ -36,6 +47,9 @@ public class JwtAuthInterceptor implements HandlerInterceptor {
try { try {
// 验证必须是Access Token // 验证必须是Access Token
if (!jwtUtil.isAccessToken(token)) { if (!jwtUtil.isAccessToken(token)) {
if (isOptionalAuthPath) {
return true; // 可选认证路径无效token也放行
}
sendError(response, HttpServletResponse.SC_UNAUTHORIZED, "无效的令牌类型"); sendError(response, HttpServletResponse.SC_UNAUTHORIZED, "无效的令牌类型");
return false; return false;
} }
@@ -54,9 +68,15 @@ public class JwtAuthInterceptor implements HandlerInterceptor {
return true; return true;
} catch (ExpiredJwtException e) { } catch (ExpiredJwtException e) {
if (isOptionalAuthPath) {
return true; // 可选认证路径过期token也放行
}
sendError(response, HttpServletResponse.SC_UNAUTHORIZED, "令牌已过期"); sendError(response, HttpServletResponse.SC_UNAUTHORIZED, "令牌已过期");
return false; return false;
} catch (JwtException e) { } catch (JwtException e) {
if (isOptionalAuthPath) {
return true; // 可选认证路径无效token也放行
}
sendError(response, HttpServletResponse.SC_UNAUTHORIZED, "无效的令牌"); sendError(response, HttpServletResponse.SC_UNAUTHORIZED, "无效的令牌");
return false; return false;
} }