diff --git a/pom.xml b/pom.xml index 2daf837..56ab843 100644 --- a/pom.xml +++ b/pom.xml @@ -459,10 +459,6 @@ cn.hutool hutool-crypto - - cn.hutool - hutool-captcha - io.github.linpeilie diff --git a/src/main/java/org/dromara/common/core/constant/Constants.java b/src/main/java/org/dromara/common/core/constant/Constants.java index cdbda89..e4251e7 100644 --- a/src/main/java/org/dromara/common/core/constant/Constants.java +++ b/src/main/java/org/dromara/common/core/constant/Constants.java @@ -62,11 +62,6 @@ public interface Constants { */ String LOGIN_FAIL = "Error"; - /** - * 验证码有效期(分钟) - */ - Integer CAPTCHA_EXPIRATION = 2; - /** * 令牌 */ diff --git a/src/main/java/org/dromara/common/core/constant/GlobalConstants.java b/src/main/java/org/dromara/common/core/constant/GlobalConstants.java index ae9bc2e..a522a8a 100644 --- a/src/main/java/org/dromara/common/core/constant/GlobalConstants.java +++ b/src/main/java/org/dromara/common/core/constant/GlobalConstants.java @@ -12,11 +12,6 @@ public interface GlobalConstants { */ String GLOBAL_REDIS_KEY = "global:"; - /** - * 验证码 redis key - */ - String CAPTCHA_CODE_KEY = GLOBAL_REDIS_KEY + "captcha_codes:"; - /** * 防重提交 redis key */ diff --git a/src/main/java/org/dromara/common/core/exception/user/CaptchaException.java b/src/main/java/org/dromara/common/core/exception/user/CaptchaException.java deleted file mode 100644 index 43824e0..0000000 --- a/src/main/java/org/dromara/common/core/exception/user/CaptchaException.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.dromara.common.core.exception.user; - -import java.io.Serial; - -/** - * 验证码错误异常类 - * - * @author ruoyi - */ -public class CaptchaException extends UserException { - - @Serial - private static final long serialVersionUID = 1L; - - public CaptchaException() { - super("user.jcaptcha.error"); - } -} diff --git a/src/main/java/org/dromara/common/core/exception/user/CaptchaExpireException.java b/src/main/java/org/dromara/common/core/exception/user/CaptchaExpireException.java deleted file mode 100644 index f4b8cac..0000000 --- a/src/main/java/org/dromara/common/core/exception/user/CaptchaExpireException.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.dromara.common.core.exception.user; - -import java.io.Serial; - -/** - * 验证码失效异常类 - * - * @author ruoyi - */ -public class CaptchaExpireException extends UserException { - - @Serial - private static final long serialVersionUID = 1L; - - public CaptchaExpireException() { - super("user.jcaptcha.expire"); - } -} diff --git a/src/main/java/org/dromara/common/web/config/CaptchaConfig.java b/src/main/java/org/dromara/common/web/config/CaptchaConfig.java deleted file mode 100644 index aecece6..0000000 --- a/src/main/java/org/dromara/common/web/config/CaptchaConfig.java +++ /dev/null @@ -1,66 +0,0 @@ -package org.dromara.common.web.config; - -import cn.hutool.captcha.CaptchaUtil; -import cn.hutool.captcha.CircleCaptcha; -import cn.hutool.captcha.LineCaptcha; -import cn.hutool.captcha.ShearCaptcha; -import org.dromara.common.web.config.properties.CaptchaProperties; -import org.springframework.boot.autoconfigure.AutoConfiguration; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Lazy; - -import java.awt.*; - -/** - * 验证码配置 - * - * @author Lion Li - */ -@Configuration -@EnableConfigurationProperties(CaptchaProperties.class) -public class CaptchaConfig { - - private static final int WIDTH = 160; - private static final int HEIGHT = 60; - private static final Color BACKGROUND = Color.PINK; - private static final Font FONT = new Font("Arial", Font.BOLD, 48); - - /** - * 圆圈干扰验证码 - */ - @Lazy - @Bean - public CircleCaptcha circleCaptcha() { - CircleCaptcha captcha = CaptchaUtil.createCircleCaptcha(WIDTH, HEIGHT); - captcha.setBackground(BACKGROUND); - captcha.setFont(FONT); - return captcha; - } - - /** - * 线段干扰的验证码 - */ - @Lazy - @Bean - public LineCaptcha lineCaptcha() { - LineCaptcha captcha = CaptchaUtil.createLineCaptcha(WIDTH, HEIGHT); - captcha.setBackground(BACKGROUND); - captcha.setFont(FONT); - return captcha; - } - - /** - * 扭曲干扰验证码 - */ - @Lazy - @Bean - public ShearCaptcha shearCaptcha() { - ShearCaptcha captcha = CaptchaUtil.createShearCaptcha(WIDTH, HEIGHT); - captcha.setBackground(BACKGROUND); - captcha.setFont(FONT); - return captcha; - } - -} diff --git a/src/main/java/org/dromara/common/web/config/properties/CaptchaProperties.java b/src/main/java/org/dromara/common/web/config/properties/CaptchaProperties.java deleted file mode 100644 index ae9e52e..0000000 --- a/src/main/java/org/dromara/common/web/config/properties/CaptchaProperties.java +++ /dev/null @@ -1,40 +0,0 @@ -package org.dromara.common.web.config.properties; - -import org.dromara.common.web.enums.CaptchaCategory; -import org.dromara.common.web.enums.CaptchaType; -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.context.annotation.Configuration; - -/** - * 验证码 配置属性 - * - * @author Lion Li - */ -@Data -@ConfigurationProperties(prefix = "captcha") -@Configuration -public class CaptchaProperties { - - private Boolean enable; - - /** - * 验证码类型 - */ - private CaptchaType type; - - /** - * 验证码类别 - */ - private CaptchaCategory category; - - /** - * 数字验证码位数 - */ - private Integer numberLength; - - /** - * 字符验证码长度 - */ - private Integer charLength; -} diff --git a/src/main/java/org/dromara/common/web/enums/CaptchaCategory.java b/src/main/java/org/dromara/common/web/enums/CaptchaCategory.java deleted file mode 100644 index ecf2658..0000000 --- a/src/main/java/org/dromara/common/web/enums/CaptchaCategory.java +++ /dev/null @@ -1,35 +0,0 @@ -package org.dromara.common.web.enums; - -import cn.hutool.captcha.AbstractCaptcha; -import cn.hutool.captcha.CircleCaptcha; -import cn.hutool.captcha.LineCaptcha; -import cn.hutool.captcha.ShearCaptcha; -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 验证码类别 - * - * @author Lion Li - */ -@Getter -@AllArgsConstructor -public enum CaptchaCategory { - - /** - * 线段干扰 - */ - LINE(LineCaptcha.class), - - /** - * 圆圈干扰 - */ - CIRCLE(CircleCaptcha.class), - - /** - * 扭曲干扰 - */ - SHEAR(ShearCaptcha.class); - - private final Class clazz; -} diff --git a/src/main/java/org/dromara/common/web/enums/CaptchaType.java b/src/main/java/org/dromara/common/web/enums/CaptchaType.java deleted file mode 100644 index d0b7334..0000000 --- a/src/main/java/org/dromara/common/web/enums/CaptchaType.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.dromara.common.web.enums; - -import cn.hutool.captcha.generator.CodeGenerator; -import cn.hutool.captcha.generator.RandomGenerator; -import org.dromara.common.web.utils.UnsignedMathGenerator; -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 验证码类型 - * - * @author Lion Li - */ -@Getter -@AllArgsConstructor -public enum CaptchaType { - - /** - * 数字 - */ - MATH(UnsignedMathGenerator.class), - - /** - * 字符 - */ - CHAR(RandomGenerator.class); - - private final Class clazz; -} diff --git a/src/main/java/org/dromara/common/web/utils/UnsignedMathGenerator.java b/src/main/java/org/dromara/common/web/utils/UnsignedMathGenerator.java deleted file mode 100644 index a400cff..0000000 --- a/src/main/java/org/dromara/common/web/utils/UnsignedMathGenerator.java +++ /dev/null @@ -1,88 +0,0 @@ -package org.dromara.common.web.utils; - -import cn.hutool.captcha.generator.CodeGenerator; -import cn.hutool.core.math.Calculator; -import cn.hutool.core.util.CharUtil; -import cn.hutool.core.util.RandomUtil; -import org.dromara.common.core.utils.StringUtils; - -import java.io.Serial; - -/** - * 无符号计算生成器 - * - * @author Lion Li - */ -public class UnsignedMathGenerator implements CodeGenerator { - - @Serial - private static final long serialVersionUID = -5514819971774091076L; - - private static final String OPERATORS = "+-*"; - - /** - * 参与计算数字最大长度 - */ - private final int numberLength; - - /** - * 构造 - */ - public UnsignedMathGenerator() { - this(2); - } - - /** - * 构造 - * - * @param numberLength 参与计算最大数字位数 - */ - public UnsignedMathGenerator(int numberLength) { - this.numberLength = numberLength; - } - - @Override - public String generate() { - final int limit = getLimit(); - int a = RandomUtil.randomInt(limit); - int b = RandomUtil.randomInt(limit); - String max = Integer.toString(Math.max(a,b)); - String min = Integer.toString(Math.min(a,b)); - max = StringUtils.rightPad(max, this.numberLength, CharUtil.SPACE); - min = StringUtils.rightPad(min, this.numberLength, CharUtil.SPACE); - - return max + RandomUtil.randomChar(OPERATORS) + min + '='; - } - - @Override - public boolean verify(String code, String userInputCode) { - int result; - try { - result = Integer.parseInt(userInputCode); - } catch (NumberFormatException e) { - // 用户输入非数字 - return false; - } - - final int calculateResult = (int) Calculator.conversion(code); - return result == calculateResult; - } - - /** - * 获取验证码长度 - * - * @return 验证码长度 - */ - public int getLength() { - return this.numberLength * 2 + 2; - } - - /** - * 根据长度获取参与计算数字最大值 - * - * @return 最大值 - */ - private int getLimit() { - return Integer.parseInt("1" + StringUtils.repeat('0', this.numberLength)); - } -} diff --git a/src/main/java/org/dromara/web/domain/vo/CaptchaVo.java b/src/main/java/org/dromara/web/domain/vo/CaptchaVo.java deleted file mode 100644 index 664df1e..0000000 --- a/src/main/java/org/dromara/web/domain/vo/CaptchaVo.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.dromara.web.domain.vo; - -import lombok.Data; - -/** - * 验证码信息 - * - * @author Michelle.Chung - */ -@Data -public class CaptchaVo { - - /** - * 是否开启验证码 - */ - private Boolean captchaEnabled = true; - - private String uuid; - - /** - * 验证码图片 - */ - private String img; - -} diff --git a/src/main/java/org/dromara/web/service/SysRegisterService.java b/src/main/java/org/dromara/web/service/SysRegisterService.java index e70de27..767e870 100644 --- a/src/main/java/org/dromara/web/service/SysRegisterService.java +++ b/src/main/java/org/dromara/web/service/SysRegisterService.java @@ -5,19 +5,13 @@ import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.RequiredArgsConstructor; import org.dromara.common.core.constant.Constants; -import org.dromara.common.core.constant.GlobalConstants; import org.dromara.common.core.domain.model.RegisterBody; import org.dromara.common.core.enums.UserType; -import org.dromara.common.core.exception.user.CaptchaException; -import org.dromara.common.core.exception.user.CaptchaExpireException; import org.dromara.common.core.exception.user.UserException; import org.dromara.common.core.utils.MessageUtils; import org.dromara.common.core.utils.ServletUtils; import org.dromara.common.core.utils.SpringUtils; -import org.dromara.common.core.utils.StringUtils; import org.dromara.common.log.event.LogininforEvent; -import org.dromara.common.redis.utils.RedisUtils; -import org.dromara.common.web.config.properties.CaptchaProperties; import org.dromara.system.domain.SysUser; import org.dromara.system.domain.bo.SysUserBo; import org.dromara.system.mapper.SysUserMapper; @@ -35,7 +29,6 @@ public class SysRegisterService { private final ISysUserService userService; private final SysUserMapper userMapper; - private final CaptchaProperties captchaProperties; /** * 注册 @@ -46,11 +39,6 @@ public class SysRegisterService { // 校验用户类型是否存在 String userType = UserType.getUserType(registerBody.getUserType()).getUserType(); - boolean captchaEnabled = captchaProperties.getEnable(); - // 验证码开关 - if (captchaEnabled) { - validateCaptcha(username, registerBody.getCode(), registerBody.getUuid()); - } SysUserBo sysUser = new SysUserBo(); sysUser.setUserName(username); sysUser.setNickName(username); @@ -70,27 +58,6 @@ public class SysRegisterService { recordLogininfor(username, Constants.REGISTER, MessageUtils.message("user.register.success")); } - /** - * 校验验证码 - * - * @param username 用户名 - * @param code 验证码 - * @param uuid 唯一标识 - */ - public void validateCaptcha(String username, String code, String uuid) { - String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + StringUtils.defaultString(uuid, ""); - String captcha = RedisUtils.getCacheObject(verifyKey); - RedisUtils.deleteObject(verifyKey); - if (captcha == null) { - recordLogininfor(username, Constants.REGISTER, MessageUtils.message("user.jcaptcha.expire")); - throw new CaptchaExpireException(); - } - if (!code.equalsIgnoreCase(captcha)) { - recordLogininfor(username, Constants.REGISTER, MessageUtils.message("user.jcaptcha.error")); - throw new CaptchaException(); - } - } - /** * 记录登录信息 * diff --git a/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java b/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java index dcb0714..d4ca7ca 100644 --- a/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java +++ b/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java @@ -7,22 +7,14 @@ import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.constant.Constants; -import org.dromara.common.core.constant.GlobalConstants; import org.dromara.common.core.domain.model.LoginUser; import org.dromara.common.core.domain.model.PasswordLoginBody; import org.dromara.common.core.enums.LoginType; import org.dromara.common.core.enums.UserStatus; -import org.dromara.common.core.exception.user.CaptchaException; -import org.dromara.common.core.exception.user.CaptchaExpireException; import org.dromara.common.core.exception.user.UserException; -import org.dromara.common.core.utils.MessageUtils; -import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.ValidatorUtils; import org.dromara.common.json.utils.JsonUtils; -import org.dromara.common.redis.utils.RedisUtils; import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.common.web.config.properties.CaptchaProperties; import org.dromara.system.domain.SysClient; import org.dromara.system.domain.SysUser; import org.dromara.system.domain.vo.SysUserVo; @@ -42,7 +34,6 @@ import org.springframework.stereotype.Service; @RequiredArgsConstructor public class PasswordAuthStrategy implements IAuthStrategy { - private final CaptchaProperties captchaProperties; private final SysLoginService loginService; private final SysUserMapper userMapper; @@ -55,12 +46,6 @@ public class PasswordAuthStrategy implements IAuthStrategy { String code = loginBody.getCode(); String uuid = loginBody.getUuid(); - boolean captchaEnabled = captchaProperties.getEnable(); - // 验证码开关 - if (captchaEnabled) { - validateCaptcha(username, code, uuid); - } - SysUserVo user = loadUserByUsername(username); loginService.checkLogin(LoginType.PASSWORD, username, () -> !BCrypt.checkpw(password, user.getPassword())); // 此处可根据登录用户的数据不同 自行创建 loginUser @@ -84,27 +69,6 @@ public class PasswordAuthStrategy implements IAuthStrategy { return loginVo; } - /** - * 校验验证码 - * - * @param username 用户名 - * @param code 验证码 - * @param uuid 唯一标识 - */ - private void validateCaptcha(String username, String code, String uuid) { - String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + StringUtils.defaultString(uuid, ""); - String captcha = RedisUtils.getCacheObject(verifyKey); - RedisUtils.deleteObject(verifyKey); - if (captcha == null) { - loginService.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")); - throw new CaptchaExpireException(); - } - if (!code.equalsIgnoreCase(captcha)) { - loginService.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error")); - throw new CaptchaException(); - } - } - private SysUserVo loadUserByUsername(String username) { SysUser user = userMapper.selectOne(new LambdaQueryWrapper() .select(SysUser::getUserName, SysUser::getStatus) diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index ec76df3..37552cf 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -7,18 +7,6 @@ ruoyi: # 版权年份 copyrightYear: 2023 -captcha: - enable: true - # 页面 <参数设置> 可开启关闭 验证码校验 - # 验证码类型 math 数组计算 char 字符验证 - type: MATH - # line 线段干扰 circle 圆圈干扰 shear 扭曲干扰 - category: CIRCLE - # 数字验证码位数 - numberLength: 1 - # 字符验证码长度 - charLength: 4 - # 开发环境配置 server: # 服务器的HTTP端口,默认为8080 diff --git a/src/main/resources/i18n/messages.properties b/src/main/resources/i18n/messages.properties index 9876158..ef6de28 100644 --- a/src/main/resources/i18n/messages.properties +++ b/src/main/resources/i18n/messages.properties @@ -1,7 +1,5 @@ #错误消息 not.null=* 必须填写 -user.jcaptcha.error=验证码错误 -user.jcaptcha.expire=验证码已失效 user.not.exists=对不起, 您的账号:{0} 不存在. user.password.not.match=用户不存在/密码错误 user.password.retry.limit.count=密码输入错误{0}次 diff --git a/src/main/resources/i18n/messages_en_US.properties b/src/main/resources/i18n/messages_en_US.properties index 0dc99ab..0fdc077 100644 --- a/src/main/resources/i18n/messages_en_US.properties +++ b/src/main/resources/i18n/messages_en_US.properties @@ -1,7 +1,5 @@ #错误消息 not.null=* Required fill in -user.jcaptcha.error=Captcha error -user.jcaptcha.expire=Captcha invalid user.not.exists=Sorry, your account: {0} does not exist user.password.not.match=User does not exist/Password error user.password.retry.limit.count=Password input error {0} times diff --git a/src/main/resources/i18n/messages_zh_CN.properties b/src/main/resources/i18n/messages_zh_CN.properties index 9876158..ef6de28 100644 --- a/src/main/resources/i18n/messages_zh_CN.properties +++ b/src/main/resources/i18n/messages_zh_CN.properties @@ -1,7 +1,5 @@ #错误消息 not.null=* 必须填写 -user.jcaptcha.error=验证码错误 -user.jcaptcha.expire=验证码已失效 user.not.exists=对不起, 您的账号:{0} 不存在. user.password.not.match=用户不存在/密码错误 user.password.retry.limit.count=密码输入错误{0}次