From b00b3c6868a2d9dcd4c40bb74a455fde653415dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E5=B0=91=E7=BF=94?= <971366405@qq.com> Date: Wed, 18 Sep 2024 10:56:55 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E5=85=B3=E9=97=AD?= =?UTF-8?q?=E9=AA=8C=E8=AF=81=E7=A0=81=E7=9A=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加关闭验证码的功能 --- .../youlai/boot/common/constant/RedisConstants.java | 5 +++++ .../java/com/youlai/boot/config/SecurityConfig.java | 2 +- .../security/filter/CaptchaValidationFilter.java | 13 ++++++++++++- .../boot/module/auth/controller/AuthController.java | 8 ++++++++ .../youlai/boot/system/service/ConfigService.java | 6 ++++++ .../boot/system/service/impl/ConfigServiceImpl.java | 11 +++++++++++ src/main/resources/application-dev.yml | 1 + src/main/resources/application-prod.yml | 1 + 8 files changed, 45 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/youlai/boot/common/constant/RedisConstants.java b/src/main/java/com/youlai/boot/common/constant/RedisConstants.java index 48ca4765..95597c58 100644 --- a/src/main/java/com/youlai/boot/common/constant/RedisConstants.java +++ b/src/main/java/com/youlai/boot/common/constant/RedisConstants.java @@ -28,6 +28,11 @@ public interface RedisConstants { */ String IP_QPS_THRESHOLD_LIMIT_KEY = "IP_QPS_THRESHOLD_LIMIT"; + /** + * 关闭验证码 + */ + String CLOSE_CAPTCHA_KEY = "CLOSE_CAPTCHA"; + /** * 手机验证码缓存前缀 */ diff --git a/src/main/java/com/youlai/boot/config/SecurityConfig.java b/src/main/java/com/youlai/boot/config/SecurityConfig.java index 88e4d375..da4f46c2 100644 --- a/src/main/java/com/youlai/boot/config/SecurityConfig.java +++ b/src/main/java/com/youlai/boot/config/SecurityConfig.java @@ -68,7 +68,7 @@ public class SecurityConfig { // 限流过滤器 http.addFilterBefore(new RateLimiterFilter(redisTemplate, configService), UsernamePasswordAuthenticationFilter.class); // 验证码校验过滤器 - http.addFilterBefore(new CaptchaValidationFilter(redisTemplate, codeGenerator), UsernamePasswordAuthenticationFilter.class); + http.addFilterBefore(new CaptchaValidationFilter(redisTemplate, codeGenerator,configService), UsernamePasswordAuthenticationFilter.class); // JWT 校验过滤器 http.addFilterBefore(new JwtValidationFilter(redisTemplate,securityProperties.getJwt().getKey()), UsernamePasswordAuthenticationFilter.class); diff --git a/src/main/java/com/youlai/boot/core/security/filter/CaptchaValidationFilter.java b/src/main/java/com/youlai/boot/core/security/filter/CaptchaValidationFilter.java index 095be092..6176b797 100644 --- a/src/main/java/com/youlai/boot/core/security/filter/CaptchaValidationFilter.java +++ b/src/main/java/com/youlai/boot/core/security/filter/CaptchaValidationFilter.java @@ -2,9 +2,12 @@ package com.youlai.boot.core.security.filter; import cn.hutool.captcha.generator.CodeGenerator; 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.constant.SymbolConstant; import com.youlai.boot.common.result.ResultCode; import com.youlai.boot.common.util.ResponseUtils; +import com.youlai.boot.system.service.ConfigService; import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; @@ -33,9 +36,12 @@ public class CaptchaValidationFilter extends OncePerRequestFilter { private final CodeGenerator codeGenerator; - public CaptchaValidationFilter(RedisTemplate redisTemplate, CodeGenerator codeGenerator) { + private final ConfigService configService; + + public CaptchaValidationFilter(RedisTemplate redisTemplate, CodeGenerator codeGenerator, ConfigService configService) { this.redisTemplate = redisTemplate; this.codeGenerator = codeGenerator; + this.configService = configService; } @@ -43,6 +49,11 @@ public class CaptchaValidationFilter extends OncePerRequestFilter { public void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException { // 检验登录接口的验证码 if (LOGIN_PATH_REQUEST_MATCHER.matches(request)) { + // 关闭验证码校验 + if (configService.getBooleanConfig(RedisConstants.CLOSE_CAPTCHA_KEY)) { + chain.doFilter(request, response); + return; + } // 请求中的验证码 String captchaCode = request.getParameter(CAPTCHA_CODE_PARAM_NAME); // TODO 兼容没有验证码的版本(线上请移除这个判断) diff --git a/src/main/java/com/youlai/boot/module/auth/controller/AuthController.java b/src/main/java/com/youlai/boot/module/auth/controller/AuthController.java index 0e20a433..2a988e18 100644 --- a/src/main/java/com/youlai/boot/module/auth/controller/AuthController.java +++ b/src/main/java/com/youlai/boot/module/auth/controller/AuthController.java @@ -1,11 +1,13 @@ package com.youlai.boot.module.auth.controller; +import com.youlai.boot.common.constant.RedisConstants; import com.youlai.boot.common.enums.LogModuleEnum; import com.youlai.boot.common.result.Result; import com.youlai.boot.module.auth.service.AuthService; import com.youlai.boot.system.model.dto.CaptchaResult; import com.youlai.boot.system.model.dto.LoginResult; import com.youlai.boot.common.annotation.Log; +import com.youlai.boot.system.service.ConfigService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -27,6 +29,7 @@ import org.springframework.web.bind.annotation.*; public class AuthController { private final AuthService authService; + private final ConfigService configService; @Operation(summary = "登录") @PostMapping("/login") @@ -54,4 +57,9 @@ public class AuthController { return Result.success(captcha); } + @Operation(summary = "获取是否关闭验证码") + @GetMapping("/captcha/unable") + public Result isCaptchaEnable() { + return Result.success(configService.getBooleanConfig(RedisConstants.CLOSE_CAPTCHA_KEY)); + } } diff --git a/src/main/java/com/youlai/boot/system/service/ConfigService.java b/src/main/java/com/youlai/boot/system/service/ConfigService.java index 988db94d..ee1718db 100644 --- a/src/main/java/com/youlai/boot/system/service/ConfigService.java +++ b/src/main/java/com/youlai/boot/system/service/ConfigService.java @@ -65,4 +65,10 @@ public interface ConfigService extends IService { */ Object getSystemConfig(String key); + /** + * 获取系统配置 + * @param key 配置键 + * @return 配置值 + */ + boolean getBooleanConfig(String key); } diff --git a/src/main/java/com/youlai/boot/system/service/impl/ConfigServiceImpl.java b/src/main/java/com/youlai/boot/system/service/impl/ConfigServiceImpl.java index c7f8579f..bd151cbd 100644 --- a/src/main/java/com/youlai/boot/system/service/impl/ConfigServiceImpl.java +++ b/src/main/java/com/youlai/boot/system/service/impl/ConfigServiceImpl.java @@ -159,4 +159,15 @@ public class ConfigServiceImpl extends ServiceImpl impleme return null; } + /** + * 获取系统配置 + * @param key 配置键 + * @return 配置值 + */ + @Override + public boolean getBooleanConfig(String key) { + Object systemConfig = getSystemConfig(key); + return systemConfig != null && Boolean.parseBoolean(systemConfig.toString()); + } + } diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 398bb917..ab42181b 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -90,6 +90,7 @@ security: - /swagger-ui/** - /swagger-ui.html - /api/v1/auth/captcha + - /api/v1/auth/captcha/unable - /ws/** # 文件存储配置 diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index 09ccde44..4ee2e889 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -74,6 +74,7 @@ security: - /swagger-ui/** - /swagger-ui.html - /api/v1/auth/captcha + - /api/v1/auth/captcha/unable - /ws/** # 文件存储配置