ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-admin/src/main/resources/application.yml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-ui/src/views/login.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java
@@ -52,6 +52,12 @@ */ @GetMapping("/captchaImage") public AjaxResult getCode() { Map<String, Object> ajax = new HashMap<>(); Boolean enabled = captchaProperties.getEnabled(); ajax.put("enabled", enabled); if (!enabled) { return AjaxResult.success(ajax); } // 保存验证码信息 String uuid = IdUtil.simpleUUID(); String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid; @@ -90,7 +96,6 @@ code = captcha.getCode(); } redisCache.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES); Map<String,Object> ajax = new HashMap<>(); ajax.put("uuid", uuid); ajax.put("img", captcha.getImageBase64()); return AjaxResult.success(ajax); ruoyi-admin/src/main/resources/application.yml
@@ -14,6 +14,8 @@ addressEnabled: false captcha: # 验证码开关 enabled: true # 验证码类型 math 数组计算 char 字符验证 type: math # line 线段干扰 circle 圆圈干扰 shear 扭曲干扰 ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java
@@ -12,6 +12,7 @@ import com.ruoyi.common.utils.MessageUtils; import com.ruoyi.common.utils.ServletUtils; import com.ruoyi.common.utils.ip.IpUtils; import com.ruoyi.framework.config.properties.CaptchaProperties; import com.ruoyi.framework.manager.AsyncManager; import com.ruoyi.framework.manager.factory.AsyncFactory; import com.ruoyi.system.service.ISysUserService; @@ -41,7 +42,10 @@ @Autowired private RedisCache redisCache; @Autowired @Autowired private CaptchaProperties captchaProperties; @Autowired private ISysUserService userService; /** @@ -55,19 +59,19 @@ */ public String login(String username, String password, String code, String uuid) { String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid; String captcha = redisCache.getCacheObject(verifyKey); redisCache.deleteObject(verifyKey); if (captcha == null) { AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"))); throw new CaptchaExpireException(); } if (!code.equalsIgnoreCase(captcha)) { AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error"))); throw new CaptchaException(); } if(captchaProperties.getEnabled()) { String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid; String captcha = redisCache.getCacheObject(verifyKey); redisCache.deleteObject(verifyKey); if (captcha == null) { AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"))); throw new CaptchaExpireException(); } if (!code.equalsIgnoreCase(captcha)) { AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error"))); throw new CaptchaException(); } } // 用户验证 Authentication authentication = null; try ruoyi-ui/src/views/login.vue
@@ -18,7 +18,7 @@ <svg-icon slot="prefix" icon-class="password" class="el-input__icon input-icon" /> </el-input> </el-form-item> <el-form-item prop="code"> <el-form-item prop="code" v-if="captchaEnabled"> <el-input v-model="loginForm.code" auto-complete="off" @@ -81,7 +81,8 @@ code: [{ required: true, trigger: "change", message: "验证码不能为空" }] }, loading: false, redirect: undefined redirect: undefined, captchaEnabled:false }; }, watch: { @@ -99,8 +100,11 @@ methods: { getCode() { getCodeImg().then(res => { this.codeUrl = "data:image/gif;base64," + res.data.img; this.loginForm.uuid = res.data.uuid; this.captchaEnabled = res.data.enabled; if(res.data.enabled){ this.codeUrl = "data:image/gif;base64," + res.data.img; this.loginForm.uuid = res.data.uuid; } }); }, getCookie() {