diff --git a/txw-sso/txw-sso-service-biz/src/main/java/com/css/txw/sso/service/verify/VerifyServiceImpl.java b/txw-sso/txw-sso-service-biz/src/main/java/com/css/txw/sso/service/verify/VerifyServiceImpl.java index 04e0c20..7ceb123 100644 --- a/txw-sso/txw-sso-service-biz/src/main/java/com/css/txw/sso/service/verify/VerifyServiceImpl.java +++ b/txw-sso/txw-sso-service-biz/src/main/java/com/css/txw/sso/service/verify/VerifyServiceImpl.java @@ -1,12 +1,22 @@ package com.css.txw.sso.service.verify; +import cn.hutool.captcha.CaptchaUtil; +import cn.hutool.captcha.ICaptcha; +import cn.hutool.captcha.generator.RandomGenerator; import cn.hutool.core.util.IdUtil; import com.css.ggzc.framework.common.pojo.CommonResult; import com.css.txw.sso.properties.SsoProperties; +import org.springframework.context.annotation.Bean; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import javax.imageio.ImageIO; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.Base64; +import java.util.HashMap; +import java.util.Map; import java.util.concurrent.TimeUnit; @@ -17,6 +27,16 @@ public class VerifyServiceImpl implements VerifyService { private StringRedisTemplate stringRedisTemplate; @Resource private SsoProperties ssoProperties; + @Resource + private ICaptcha lineCaptcha; + + @Bean + public ICaptcha lineCaptcha() { + RandomGenerator randomGenerator = new RandomGenerator("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", 4); + cn.hutool.captcha.CircleCaptcha captcha = CaptchaUtil.createCircleCaptcha(120, 40, 4, 20); + captcha.setGenerator(randomGenerator); + return captcha; + } @Override public CommonResult getVerifyToken(String remoteId) { @@ -38,4 +58,51 @@ public class VerifyServiceImpl implements VerifyService { String VERIFY_TOKEN = "verify_token:%s"; return String.format(VERIFY_TOKEN, verifyToken); } + + @Override + public CommonResult> getCaptcha(String remoteId) { + String code = lineCaptcha.getCode(); + String uuid = IdUtil.fastSimpleUUID(); + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + try { + ImageIO.write(lineCaptcha.getImage(), "png", baos); + } catch (IOException e) { + throw new RuntimeException("生成验证码图片失败", e); + } + String imageBase64 = "data:image/png;base64," + Base64.getEncoder().encodeToString(baos.toByteArray()); + + stringRedisTemplate.opsForValue().set( + formatCaptchaKey(uuid), + code.toLowerCase(), + 5, + TimeUnit.MINUTES + ); + + Map result = new HashMap<>(); + result.put("uuid", uuid); + result.put("imageBase64", imageBase64); + return CommonResult.success(result); + } + + @Override + public Boolean checkCaptcha(String uuid, String code) { + if (!this.ssoProperties.isLoginCaptcha()) { + return true; + } + if (org.springframework.util.StringUtils.isBlank(uuid) || org.springframework.util.StringUtils.isBlank(code)) { + return false; + } + String key = formatCaptchaKey(uuid); + String cachedCode = stringRedisTemplate.opsForValue().get(key); + if (cachedCode == null) { + return false; + } + stringRedisTemplate.delete(key); + return cachedCode.equalsIgnoreCase(code); + } + + private static String formatCaptchaKey(String uuid) { + return "captcha:" + uuid; + } }