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/** # 文件存储配置