From a8403613faffb1d94c6256570cd1ec9441032989 Mon Sep 17 00:00:00 2001 From: "Ray.Hao" <1490493387@qq.com> Date: Tue, 9 Jun 2026 15:53:35 +0800 Subject: [PATCH] =?UTF-8?q?token=E8=BF=87=E6=9C=9F=E6=94=B9=E4=B8=BA?= =?UTF-8?q?=E8=BF=94=E5=9B=9E401=EF=BC=9BCaptchaValidationException?= =?UTF-8?q?=E9=87=8D=E5=91=BD=E5=90=8D=E4=B8=BASmsCaptchaException?= =?UTF-8?q?=EF=BC=9Bv4.3.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/images/qr/wechat-app.jpg | Bin 0 -> 44331 bytes docs/images/qr/wechat-mp.jpg | Bin 44188 -> 0 bytes pom.xml | 2 +- ...xception.java => SmsCaptchaException.java} | 8 +++---- .../exception/TokenInvalidException.java | 21 ++++++++++++++++++ .../provider/SmsAuthenticationProvider.java | 10 ++++----- .../security/token/JwtTokenManager.java | 4 ++-- .../security/token/RedisTokenManager.java | 4 ++-- .../web/advice/GlobalExceptionHandler.java | 12 ++++++++++ 9 files changed, 47 insertions(+), 14 deletions(-) create mode 100644 docs/images/qr/wechat-app.jpg delete mode 100644 docs/images/qr/wechat-mp.jpg rename src/main/java/com/youlai/boot/framework/security/exception/{CaptchaValidationException.java => SmsCaptchaException.java} (56%) create mode 100644 src/main/java/com/youlai/boot/framework/security/exception/TokenInvalidException.java diff --git a/docs/images/qr/wechat-app.jpg b/docs/images/qr/wechat-app.jpg new file mode 100644 index 0000000000000000000000000000000000000000..73a907b25dccf6ea2f1f17a66f0767b90e7ec075 GIT binary patch literal 44331 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 literal 0 HcmV?d00001 diff --git a/docs/images/qr/wechat-mp.jpg b/docs/images/qr/wechat-mp.jpg deleted file mode 100644 index 8c06ee372f27bf5961aa929c83e5a84970d6a1bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44188 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 diff --git a/pom.xml b/pom.xml index 6bbc8410..100bc70f 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.youlai youlai-boot - 4.3.0 + 4.3.1 基于 Java 17 + SpringBoot 4 + Spring Security 构建的权限管理系统。 diff --git a/src/main/java/com/youlai/boot/framework/security/exception/CaptchaValidationException.java b/src/main/java/com/youlai/boot/framework/security/exception/SmsCaptchaException.java similarity index 56% rename from src/main/java/com/youlai/boot/framework/security/exception/CaptchaValidationException.java rename to src/main/java/com/youlai/boot/framework/security/exception/SmsCaptchaException.java index b7c68cc4..8fca2cd9 100644 --- a/src/main/java/com/youlai/boot/framework/security/exception/CaptchaValidationException.java +++ b/src/main/java/com/youlai/boot/framework/security/exception/SmsCaptchaException.java @@ -3,13 +3,13 @@ package com.youlai.boot.framework.security.exception; import org.springframework.security.core.AuthenticationException; /** - * 验证码校验异常 + * 短信验证码异常 * * @author Ray.Hao * @since 2025/3/1 */ -public class CaptchaValidationException extends AuthenticationException { - public CaptchaValidationException(String msg) { +public class SmsCaptchaException extends AuthenticationException { + public SmsCaptchaException(String msg) { super(msg); } -} \ No newline at end of file +} diff --git a/src/main/java/com/youlai/boot/framework/security/exception/TokenInvalidException.java b/src/main/java/com/youlai/boot/framework/security/exception/TokenInvalidException.java new file mode 100644 index 00000000..a4bb93c2 --- /dev/null +++ b/src/main/java/com/youlai/boot/framework/security/exception/TokenInvalidException.java @@ -0,0 +1,21 @@ +package com.youlai.boot.framework.security.exception; + +import com.youlai.boot.common.result.ResultCode; +import lombok.Getter; + +/** + * Token 无效异常(access_token 或 refresh_token 过期/无效) + * + * @author Ray.Hao + * @since 4.3.1 + */ +@Getter +public class TokenInvalidException extends RuntimeException { + + private final ResultCode resultCode; + + public TokenInvalidException(ResultCode resultCode) { + super(resultCode.getMsg()); + this.resultCode = resultCode; + } +} diff --git a/src/main/java/com/youlai/boot/framework/security/provider/SmsAuthenticationProvider.java b/src/main/java/com/youlai/boot/framework/security/provider/SmsAuthenticationProvider.java index ec5c63f1..3450bd7a 100644 --- a/src/main/java/com/youlai/boot/framework/security/provider/SmsAuthenticationProvider.java +++ b/src/main/java/com/youlai/boot/framework/security/provider/SmsAuthenticationProvider.java @@ -3,7 +3,7 @@ package com.youlai.boot.framework.security.provider; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.youlai.boot.common.constant.RedisConstants; -import com.youlai.boot.framework.security.exception.CaptchaValidationException; +import com.youlai.boot.framework.security.exception.SmsCaptchaException; import com.youlai.boot.framework.security.model.SmsAuthenticationToken; import com.youlai.boot.framework.security.model.SysUserDetails; import com.youlai.boot.framework.security.model.UserAuthInfo; @@ -62,11 +62,11 @@ public class SmsAuthenticationProvider implements AuthenticationProvider { // 参数校验 if (StrUtil.isBlank(mobile)) { log.warn("短信验证码登录失败:手机号为空"); - throw new CaptchaValidationException("手机号不能为空"); + throw new SmsCaptchaException("手机号不能为空"); } if (StrUtil.isBlank(inputVerifyCode)) { log.warn("短信验证码登录失败:验证码为空,手机号={}", mobile); - throw new CaptchaValidationException("验证码不能为空"); + throw new SmsCaptchaException("验证码不能为空"); } // 根据手机号获取用户信息 @@ -89,12 +89,12 @@ public class SmsAuthenticationProvider implements AuthenticationProvider { if (cachedVerifyCode == null) { log.warn("短信验证码登录失败:验证码已过期,手机号={}", mobile); - throw new CaptchaValidationException("验证码已过期,请重新获取"); + throw new SmsCaptchaException("验证码已过期,请重新获取"); } if (!StrUtil.equals(inputVerifyCode, cachedVerifyCode)) { log.warn("短信验证码登录失败:验证码错误,手机号={}", mobile); - throw new CaptchaValidationException("验证码错误"); + throw new SmsCaptchaException("验证码错误"); } // 验证成功后删除验证码,防止重复使用 diff --git a/src/main/java/com/youlai/boot/framework/security/token/JwtTokenManager.java b/src/main/java/com/youlai/boot/framework/security/token/JwtTokenManager.java index 10966bd5..1b153f64 100644 --- a/src/main/java/com/youlai/boot/framework/security/token/JwtTokenManager.java +++ b/src/main/java/com/youlai/boot/framework/security/token/JwtTokenManager.java @@ -12,9 +12,9 @@ import cn.hutool.jwt.JWTUtil; import com.youlai.boot.common.constant.JwtClaimConstants; import com.youlai.boot.common.constant.RedisConstants; import com.youlai.boot.common.constant.SecurityConstants; -import com.youlai.boot.common.exception.BusinessException; import com.youlai.boot.common.result.ResultCode; import com.youlai.boot.framework.security.config.SecurityProperties; +import com.youlai.boot.framework.security.exception.TokenInvalidException; import com.youlai.boot.framework.security.model.AuthenticationToken; import com.youlai.boot.framework.security.model.RoleDataScope; import org.apache.commons.lang3.StringUtils; @@ -300,7 +300,7 @@ public class JwtTokenManager implements TokenManager { public AuthenticationToken refreshToken(String refreshToken) { boolean isValid = validateRefreshToken(refreshToken); if (!isValid) { - throw new BusinessException(ResultCode.REFRESH_TOKEN_INVALID); + throw new TokenInvalidException(ResultCode.REFRESH_TOKEN_INVALID); } Authentication authentication = parseToken(refreshToken); int accessTokenExpiration = securityProperties.getSession().getAccessTokenTimeToLive(); diff --git a/src/main/java/com/youlai/boot/framework/security/token/RedisTokenManager.java b/src/main/java/com/youlai/boot/framework/security/token/RedisTokenManager.java index 1616bbee..f58ab324 100644 --- a/src/main/java/com/youlai/boot/framework/security/token/RedisTokenManager.java +++ b/src/main/java/com/youlai/boot/framework/security/token/RedisTokenManager.java @@ -5,9 +5,9 @@ import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; import com.youlai.boot.common.constant.RedisConstants; import com.youlai.boot.common.constant.SecurityConstants; -import com.youlai.boot.common.exception.BusinessException; import com.youlai.boot.common.result.ResultCode; import com.youlai.boot.framework.security.config.SecurityProperties; +import com.youlai.boot.framework.security.exception.TokenInvalidException; import com.youlai.boot.framework.security.model.AuthenticationToken; import com.youlai.boot.framework.security.model.UserSession; import com.youlai.boot.framework.security.model.SysUserDetails; @@ -147,7 +147,7 @@ public class RedisTokenManager implements TokenManager { UserSession userSession = (UserSession) redisTemplate.opsForValue() .get(StrUtil.format(RedisConstants.Auth.REFRESH_TOKEN_USER, refreshToken)); if (userSession == null) { - throw new BusinessException(ResultCode.REFRESH_TOKEN_INVALID); + throw new TokenInvalidException(ResultCode.REFRESH_TOKEN_INVALID); } Object oldAccessTokenValue = redisTemplate.opsForValue().get(StrUtil.format(RedisConstants.Auth.USER_ACCESS_TOKEN, userSession.getUserId())); // 删除旧的访问令牌记录 diff --git a/src/main/java/com/youlai/boot/framework/web/advice/GlobalExceptionHandler.java b/src/main/java/com/youlai/boot/framework/web/advice/GlobalExceptionHandler.java index 7be6bbce..9b74c532 100644 --- a/src/main/java/com/youlai/boot/framework/web/advice/GlobalExceptionHandler.java +++ b/src/main/java/com/youlai/boot/framework/web/advice/GlobalExceptionHandler.java @@ -5,6 +5,7 @@ import tools.jackson.core.JacksonException; import com.youlai.boot.common.exception.BusinessException; import com.youlai.boot.common.result.Result; import com.youlai.boot.common.result.ResultCode; +import com.youlai.boot.framework.security.exception.TokenInvalidException; import jakarta.servlet.ServletException; import jakarta.validation.ConstraintViolation; import jakarta.validation.ConstraintViolationException; @@ -222,6 +223,17 @@ public class GlobalExceptionHandler { return Result.failed(ResultCode.INTEGRITY_CONSTRAINT_VIOLATION); } + /** + * 处理 Token 无效异常 + *

+ * 当 access_token 或 refresh_token 过期/无效时,返回 401。 + */ + @ExceptionHandler(TokenInvalidException.class) + @ResponseStatus(HttpStatus.UNAUTHORIZED) + public Result handleTokenInvalidException(TokenInvalidException e) { + return Result.failed(e.getResultCode()); + } + /** * 处理业务异常 *