From 7f4ec50cefca96ad37936239449d4dd3ef839161 Mon Sep 17 00:00:00 2001 From: "Ray.Hao" <1490493387@qq.com> Date: Tue, 25 Feb 2025 00:07:17 +0800 Subject: [PATCH 1/6] =?UTF-8?q?refactor:=20=E5=AE=8C=E5=96=84=E5=9B=A0?= =?UTF-8?q?=E7=BC=BA=E5=A4=B1=20Token=20=E8=80=8C=E8=AE=A4=E8=AF=81?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=E5=93=8D=E5=BA=94=E7=9A=84=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exception/MyAuthenticationEntryPoint.java | 36 +++++++++++-------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/youlai/boot/core/security/exception/MyAuthenticationEntryPoint.java b/src/main/java/com/youlai/boot/core/security/exception/MyAuthenticationEntryPoint.java index 11efd9df..65c50929 100644 --- a/src/main/java/com/youlai/boot/core/security/exception/MyAuthenticationEntryPoint.java +++ b/src/main/java/com/youlai/boot/core/security/exception/MyAuthenticationEntryPoint.java @@ -3,10 +3,9 @@ package com.youlai.boot.core.security.exception; import com.youlai.boot.common.result.ResultCode; import com.youlai.boot.common.util.ResponseUtils; import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.authentication.InsufficientAuthenticationException; import org.springframework.security.core.AuthenticationException; -import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.security.web.AuthenticationEntryPoint; -import org.springframework.stereotype.Component; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; @@ -15,26 +14,35 @@ import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; /** - * 未认证异常处理器 + * 统一处理 Spring Security 认证失败响应 * * @author Ray.Hao * @since 2.0.0 */ public class MyAuthenticationEntryPoint implements AuthenticationEntryPoint { + + /** + * 认证失败处理入口方法 + * + * @param request 触发异常的请求对象(可用于获取请求头、参数等) + * @param response 响应对象(用于写入错误信息) + * @param authException 认证异常对象(包含具体失败原因) + */ @Override public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException { - int status = response.getStatus(); - if (status == HttpServletResponse.SC_NOT_FOUND) { - // 资源不存在 - ResponseUtils.writeErrMsg(response, ResultCode.USER_RESOURCE_NOT_FOUND); + if (authException instanceof BadCredentialsException) { + // 用户名或密码错误 + ResponseUtils.writeErrMsg(response, ResultCode.USER_PASSWORD_ERROR, authException.getMessage()); + } else if(authException instanceof InsufficientAuthenticationException){ + // 请求头缺失Authorization、Token格式错误、Token过期、签名验证失败 + ResponseUtils.writeErrMsg(response, ResultCode.ACCESS_TOKEN_INVALID); } else { - if (authException instanceof BadCredentialsException) { - // 用户名或密码错误 - ResponseUtils.writeErrMsg(response, ResultCode.USER_PASSWORD_ERROR, authException.getMessage()); - } else { - // 登录异常 - ResponseUtils.writeErrMsg(response, ResultCode.USER_LOGIN_EXCEPTION, authException.getMessage()); - } + // 其他未明确处理的认证异常(如账户被锁定、账户禁用等) + ResponseUtils.writeErrMsg(response, ResultCode.USER_LOGIN_EXCEPTION, authException.getMessage()); } } } + + + + From 8391f931211f09ed5a9ef34a6678c89bcde46819 Mon Sep 17 00:00:00 2001 From: "Ray.Hao" <1490493387@qq.com> Date: Tue, 25 Feb 2025 00:07:39 +0800 Subject: [PATCH 2/6] =?UTF-8?q?chore:=20=E5=AE=8C=E5=96=84=E6=B3=A8?= =?UTF-8?q?=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/youlai/boot/system/controller/LogController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/youlai/boot/system/controller/LogController.java b/src/main/java/com/youlai/boot/system/controller/LogController.java index df7890cd..606ef5db 100644 --- a/src/main/java/com/youlai/boot/system/controller/LogController.java +++ b/src/main/java/com/youlai/boot/system/controller/LogController.java @@ -21,7 +21,7 @@ import java.util.List; /** * 日志控制层 * - * @author Ray + * @author Ray.Hao * @since 2.10.0 */ @Tag(name = "13.日志接口") From 77adafc20c9aa816c9ebeeba127ddd5ba3d6996d Mon Sep 17 00:00:00 2001 From: "Ray.Hao" <1490493387@qq.com> Date: Sat, 1 Mar 2025 00:41:44 +0800 Subject: [PATCH 3/6] =?UTF-8?q?refactor:=20Spring=20Security=20=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E5=A4=84=E7=90=86=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exception/CaptchaValidationException.java | 15 +++++++++++++++ .../exception/MyAuthenticationEntryPoint.java | 2 +- .../extension/sms/SmsAuthenticationProvider.java | 4 ++-- 3 files changed, 18 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/youlai/boot/core/security/exception/CaptchaValidationException.java diff --git a/src/main/java/com/youlai/boot/core/security/exception/CaptchaValidationException.java b/src/main/java/com/youlai/boot/core/security/exception/CaptchaValidationException.java new file mode 100644 index 00000000..7b498a1a --- /dev/null +++ b/src/main/java/com/youlai/boot/core/security/exception/CaptchaValidationException.java @@ -0,0 +1,15 @@ +package com.youlai.boot.core.security.exception; + +import org.springframework.security.core.AuthenticationException; + +/** + * 验证码校验异常 + * + * @author Ray.Hao + * @since 2025/3/1 + */ +public class CaptchaValidationException extends AuthenticationException { + public CaptchaValidationException(String msg) { + super(msg); + } +} \ No newline at end of file diff --git a/src/main/java/com/youlai/boot/core/security/exception/MyAuthenticationEntryPoint.java b/src/main/java/com/youlai/boot/core/security/exception/MyAuthenticationEntryPoint.java index 65c50929..ff5f041e 100644 --- a/src/main/java/com/youlai/boot/core/security/exception/MyAuthenticationEntryPoint.java +++ b/src/main/java/com/youlai/boot/core/security/exception/MyAuthenticationEntryPoint.java @@ -32,7 +32,7 @@ public class MyAuthenticationEntryPoint implements AuthenticationEntryPoint { public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException { if (authException instanceof BadCredentialsException) { // 用户名或密码错误 - ResponseUtils.writeErrMsg(response, ResultCode.USER_PASSWORD_ERROR, authException.getMessage()); + ResponseUtils.writeErrMsg(response, ResultCode.USER_PASSWORD_ERROR); } else if(authException instanceof InsufficientAuthenticationException){ // 请求头缺失Authorization、Token格式错误、Token过期、签名验证失败 ResponseUtils.writeErrMsg(response, ResultCode.ACCESS_TOKEN_INVALID); diff --git a/src/main/java/com/youlai/boot/core/security/extension/sms/SmsAuthenticationProvider.java b/src/main/java/com/youlai/boot/core/security/extension/sms/SmsAuthenticationProvider.java index fc71fe37..bc048794 100644 --- a/src/main/java/com/youlai/boot/core/security/extension/sms/SmsAuthenticationProvider.java +++ b/src/main/java/com/youlai/boot/core/security/extension/sms/SmsAuthenticationProvider.java @@ -3,13 +3,13 @@ package com.youlai.boot.core.security.extension.sms; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.youlai.boot.common.constant.RedisConstants; +import com.youlai.boot.core.security.exception.CaptchaValidationException; import com.youlai.boot.core.security.model.SysUserDetails; import com.youlai.boot.system.model.dto.UserAuthInfo; import com.youlai.boot.system.service.UserService; import lombok.extern.slf4j.Slf4j; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.security.authentication.AuthenticationProvider; -import org.springframework.security.authentication.BadCredentialsException; import org.springframework.security.authentication.DisabledException; import org.springframework.security.core.Authentication; import org.springframework.security.core.AuthenticationException; @@ -64,7 +64,7 @@ public class SmsAuthenticationProvider implements AuthenticationProvider { String cachedVerifyCode = (String) redisTemplate.opsForValue().get(RedisConstants.SMS_LOGIN_CODE_PREFIX + mobile); if (!StrUtil.equals(inputVerifyCode, cachedVerifyCode)) { - throw new BadCredentialsException("验证码错误"); + throw new CaptchaValidationException("验证码错误"); } else { // 验证成功后删除验证码 redisTemplate.delete(RedisConstants.SMS_LOGIN_CODE_PREFIX + mobile); From ccd3b3ad2b5a2190cd253037de989cf77437c082 Mon Sep 17 00:00:00 2001 From: "Ray.Hao" <1490493387@qq.com> Date: Sun, 2 Mar 2025 20:38:22 +0800 Subject: [PATCH 4/6] =?UTF-8?q?refactor:=20=E4=BC=98=E5=8C=96=E9=AA=8C?= =?UTF-8?q?=E8=AF=81=E7=A0=81=E9=94=99=E8=AF=AF=E6=96=87=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/youlai/boot/common/result/ResultCode.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/youlai/boot/common/result/ResultCode.java b/src/main/java/com/youlai/boot/common/result/ResultCode.java index 026927ef..4f046f6e 100644 --- a/src/main/java/com/youlai/boot/common/result/ResultCode.java +++ b/src/main/java/com/youlai/boot/common/result/ResultCode.java @@ -67,7 +67,7 @@ public enum ResultCode implements IResultCode, Serializable { REFRESH_TOKEN_INVALID("A0231", "刷新令牌无效或已过期"), // 验证码错误 - USER_VERIFICATION_CODE_ERROR("A0240", "用户验证码错误"), + USER_VERIFICATION_CODE_ERROR("A0240", "验证码错误"), USER_VERIFICATION_CODE_ATTEMPT_LIMIT_EXCEEDED("A0241", "用户验证码尝试次数超限"), USER_VERIFICATION_CODE_EXPIRED("A0242", "用户验证码过期"), From b1e55aae0abe2d4cef8215e394c86218aa49e20e Mon Sep 17 00:00:00 2001 From: "Ray.Hao" <1490493387@qq.com> Date: Sun, 2 Mar 2025 20:55:00 +0800 Subject: [PATCH 5/6] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20Minio=20?= =?UTF-8?q?=E6=8C=87=E5=AE=9A=E6=8E=A7=E5=88=B6=E5=8F=B0=E7=AB=AF=E5=8F=A3?= =?UTF-8?q?=E5=92=8C=E6=98=A0=E5=B0=84=E7=AB=AF=E5=8F=A3=E4=B8=8D=E4=B8=80?= =?UTF-8?q?=E8=87=B4=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes #IBQ0R0 --- docker/docker-compose.yml | 2 +- docker/run.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 7cb652f9..f27b011e 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -40,7 +40,7 @@ services: image: minio/minio:latest container_name: minio restart: unless-stopped - command: server /data --console-address ":9090" + command: server /data --console-address ":9001" ports: - 9000:9000 - 9001:9001 diff --git a/docker/run.md b/docker/run.md index 04fb55e4..1ee1fe5e 100644 --- a/docker/run.md +++ b/docker/run.md @@ -4,13 +4,13 @@ ## 安装 ```bash -docker-compose -f docker-compose.yml -p youlai-boot up -d +docker-compose -f ./docker-compose.yml -p youlai-boot up -d ``` - p youlai-boot 指定命名空间,避免与其他容器冲突,这里方便管理,统一管理和卸载 ## 卸载 ```bash -docker-compose -f docker-compose.yml -p youlai-boot down +docker-compose -f ./docker-compose.yml -p youlai-boot down ``` From 422568bc41704acd48e50d82042100ba106d8695 Mon Sep 17 00:00:00 2001 From: Theo <971366405@qq.com> Date: Mon, 3 Mar 2025 14:38:50 +0800 Subject: [PATCH 6/6] =?UTF-8?q?feat(form):=20=E4=B8=BA=20LocalDateTime=20?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E7=9A=84=E5=AD=97=E6=AE=B5=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=20JsonFormat=20=E6=B3=A8=E8=A7=A3-=20=E5=9C=A8=E6=A8=A1?= =?UTF-8?q?=E6=9D=BF=E4=B8=AD=E6=B7=BB=E5=8A=A0=E4=BA=86=E5=AF=B9=20LocalD?= =?UTF-8?q?ateTime=20=E7=B1=BB=E5=9E=8B=E5=AD=97=E6=AE=B5=E7=9A=84?= =?UTF-8?q?=E5=A4=84=E7=90=86=20-=E4=B8=BA=20LocalDateTime=20=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E6=B7=BB=E5=8A=A0=E4=BA=86=20@JsonFormat=20=E6=B3=A8?= =?UTF-8?q?=E8=A7=A3=EF=BC=8C=E7=94=A8=E4=BA=8E=E6=8C=87=E5=AE=9A=E6=97=A5?= =?UTF-8?q?=E6=9C=9F=E6=97=B6=E9=97=B4=E6=A0=BC=E5=BC=8F=20-=20=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=20timezone=20=E4=B8=BA=20GMT+8=EF=BC=8Cpattern=20?= =?UTF-8?q?=E4=B8=BA=20yyyy-MM-dd=20HH:mm:ss?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/templates/codegen/form.java.vm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/resources/templates/codegen/form.java.vm b/src/main/resources/templates/codegen/form.java.vm index e2c07377..f05ce6b8 100644 --- a/src/main/resources/templates/codegen/form.java.vm +++ b/src/main/resources/templates/codegen/form.java.vm @@ -7,6 +7,7 @@ import lombok.Getter; import lombok.Setter; #if(${hasLocalDateTime}) import java.time.LocalDateTime; +import com.fasterxml.jackson.annotation.JsonFormat; #end #if(${hasBigDecimal}) import java.math.BigDecimal; @@ -46,6 +47,9 @@ public class ${entityName}Form implements Serializable { #if($fieldConfig.maxLength) @Size(max=$fieldConfig.maxLength, message="$fieldConfig.fieldComment长度不能超过${fieldConfig.maxLength}个字符") #end + #if($fieldConfig.fieldType == 'LocalDateTime') + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + #end private ${fieldConfig.fieldType} ${fieldConfig.fieldName}; #end