
Spring Boot Vue Uniapp 企业登录安全图形/滑块验证码 短信验证码 Redis 限频实战一句话密码只是第一道门验证码挡机器、短信验真人、Redis 控频率、日志留痕迹——四层叠在一起登录页才敢对外网开放。开源仓库GitCode · RuoyiOfficeAtomGit · RuoyiOffice先看登录页长什么样多租户、账号密码、手机号登录、扫码与第三方入口——企业登录从来不是「两个输入框 按钮」。本机开发环境常会关掉图形验证码方便调试生产必须打开。下文按「打开验证码后的真实链路」讲。为什么企业登录不能只校验密码攻击面只靠密码会怎样企业常见对策撞库 / 暴力破解弱口令几分钟试完图形或滑块验证码 失败锁定短信轰炸接口被刷成运营账单场景码 日上限 IP/手机号频控验证码复用截到一次短信反复登录核销即失效Redis 标记 used审计缺失出事对不上人登录成功/失败写登录日志多端入口只做 PC、忘了 App同一套 Auth API前端换壳RuoyiOffice 管理端认证集中在系统模块 Auth 服务账号登录、短信登录、发送短信、刷新 Token、登出共用一套 Token 发放逻辑。整体架构四层防御┌──────────────── Vue3 / UniApp 登录页 ────────────────┐ │ 租户选择 │ 账号密码 │ 滑块/图形 │ 手机号短信 │ 扫码… │ └────────────┬───────────────┬───────────────┬─────────┘ │ │ │ POST /login POST /send-sms-code POST /sms-login │ │ │ ▼ ▼ ▼ ┌──────────────── Spring Boot 3 AuthService ─────────────┐ │ ① 验证码开关 → CaptchaService.verification │ │ ② 认证用户密码 / 短信码 │ │ ③ 写登录日志成功/失败原因 │ │ ④ 发 OAuth2 AccessToken RefreshToken │ └────────────┬───────────────┬───────────────────────────┘ │ │ ▼ ▼ RedisAJ-Captcha Redis短信码 频控第一层图形 / 滑块验证码挡机器设计要点可配置开关开发关掉、生产打开关闭时校验直接放行避免联调被滑块卡住。校验发生在密码校验之前验证码错了不要去撞数据库密码既省资源也少暴露「用户是否存在」的时序差异仍建议错误文案统一。失败也写登录日志原因记为「验证码错误」方便安全同学看爆破曲线。实现可插拔项目里用 AJ-Captcha Redis 存挑战态也可换成纯图形字、Turnstile 等只要登录 VO 带上captchaVerification或你们约定的字段。伪代码对应真实服务结构voidvalidateCaptcha(LoginReqreq){if(!captchaEnable){return;// 开发环境}ResponseModelrcaptchaService.verification(req.getCaptchaVerification());if(!r.isSuccess()){createLoginLog(...,CAPTCHA_CODE_ERROR);throwbusinessException(r.getMessage());}}AuthLoginResplogin(LoginReqreq){validateCaptcha(req);// 先挡机器AdminUseruserauthenticate(req.getUsername(),req.getPassword());returncreateTokenAfterLoginSuccess(user);}前端配合滑块成功后拿到captchaVerification和账号密码一起提交。验证码失败刷新挑战不要清空密码体验友好。记住验证码是一次性挑战刷新页面必须重新滑。生产建议项建议开关配置中心 / 环境变量禁止写死在前端Redis与业务 Redis 可同实例建议独立 key 前缀难度对公网管理端用滑块内网可降级图形字CDN验证码静态资源走 HTTPS防混合内容第二层短信验证码验真人 无密码登录账号密码适合办公电脑手机号登录适合外勤、忘记密码、高管临时看审批。发送链路前端输入手机号 场景码如后台登录 ↓ AuthController.sendSmsCode ↓ SmsCodeService.createSmsCode ├─ 校验场景是否启用 ├─ 查最近一条未过期且间隔 频率 → 拒绝防连点 ├─ 今日已发条数 ≥ 日上限 → 拒绝防轰炸 ├─ 生成 46 位码写入记录表 / Redis └─ 调短信通道发送登录链路smsLogin(mobile, code) → 校验场景 核销验证码标记已使用 → 按手机号找用户不存在可按产品策略拒绝或自动注册管理端通常拒绝 → 同账号登录一样发 Token 写成功日志频控参数怎么定参数经验值说明发送间隔60s小于间隔直接拒前端倒计时对齐日上限1020 / 手机号 / 场景按短信成本调有效期510 分钟过期自动失效核销成功登录即 used禁止「一条短信登三次」场景码很重要同一手机号「登录」和「改密」应分开计数避免改密把登录额度耗光。第三层Token 与登出验证码和短信只解决「你是谁」会话靠 AccessToken登录成功 →createAccessToken绑定用户类型、客户端刷新 →refreshToken登出 → 删 Token 写登出日志前端要做401 统一跳登录、多页签共享 Token 策略、敏感操作可二次校验短信。第四层失败日志与运营看板至少区分这些结果枚举名称可自定验证码错误账号或密码错误用户禁用短信码错误 / 过期登录成功安全同学按小时聚合「验证码错误」和「密码错误」前者暴涨像脚本后者暴涨像撞库。和「限流 / 幂等」怎么分工能力解决什么不解决什么验证码机器批量试同一真人慢速撞库需锁定短信频控短信账单与骚扰密码爆破网关限流单 IP QPS分布式代理池账号锁定连续密码错误验证码被刷应在验证码层挡建议验证码错误不计入密码错误次数否则攻击者可故意输错验证码锁死管理员或反过来只计密码错误验证码失败单独告警。前端多入口一套 API多种壳入口主要校验账号密码验证码 密码手机号登录短信码可再加图形码防刷发送接口扫码二维码票据轮询 已登录端确认第三方OAuth 回调绑定本系统用户PC 与 App 共用后端 Auth差别只在 UI 与深链。移动端也要带租户或企业码否则多租户会串。配置清单上线前核对生产打开图形/滑块验证码Redis 可达验证码与短信 key 不冲突短信通道签名、模板已审场景码已配置发送间隔、日上限与产品文案一致登录失败日志入库且可查HTTPSCookie/Token 不落明文日志开发环境开关与生产隔离别把生产关掉图方便FAQQ1开发环境验证码太烦怎么办A用配置关闭校验切勿把关闭逻辑写进前端「隐藏滑块但仍提交空串」——后端一开就全员登录失败。Q2短信接口要不要再套一层图形码A公网强烈建议。否则脚本可绕过登录页直接打send-sms-code。Q3验证码存 DB 还是 RedisA挑战态、短 TTL 优先 Redis审计流水可落 DB。短信「今日条数」可用记录表 count也可用 Redis INCR 次日过期。Q4多租户下验证码是否按租户隔离A挑战本身可不绑租户但登录必须先解析租户再查该租户用户短信模板也可按租户品牌定制。Q5和注册、忘记密码如何复用A复用 SmsCodeService换场景码与模板不要复用「登录成功发 Token」那段到注册未完成状态。和 RuoyiOffice 的对应关系能力开源中的位置概念账号 / 短信登录 API系统模块 AuthController验证码校验与开关AuthService Captcha 配置AJ-Captcha RedisFramework Captcha 自动配置短信创建 / 频控 / 核销SmsCodeServicePC 登录页web-antd/auth/loginApp 登录UniApp 登录页完整后端GitCode / AtomGit前端GitCode · vben移动端GitCode · uniapp延伸阅读Spring Boot 3 Vue3 企业级 RBACBPM 任务操作按钮设计产品向何时该上 OA、AI 二开主源码等文见专栏同系列总结企业登录安全是产品能力不是装饰验证码挡机器且可按环境开关短信验真人频控 核销缺一不可Token 会话与登录日志构成审计闭环PC / App / 第三方共用 Auth前端只换壳下一篇我们换业务视角审批单如何驱动人事主数据入职建档、转正改状态以及为什么「状态更新」和「建档」必须拆事务。⭐ GitCode · AtomGit 点星夏日活动攒积分。在线体验https://www.ruoyioffice.com商业版源码授权https://www.ruoyioffice.com/contact·企业微信 17156169080关键词Spring Boot 3 登录安全、滑块验证码、短信验证码、Redis 限频、Vue3 登录页、多租户认证、OAuth2 Token