Date: 9/30/2026Category: GoWind风行Tag: Golang, Go-Kratos, GoWind, Security
登录是管理系统被攻击最多的面:撞库、爆破、凭证枚举、会话劫持。很多项目的登录只有"验密码、发 token"两步,其余全靠运气。风行(GoWind Admin)把认证做成了纵深防御的完整链路:限流、验证码、登录策略、防枚举、MFA、令牌轮换、会话吊销层层设卡。本文拆解这条链路的设计与取舍。
一、登录链路:十一道闸门按序把关
一次 POST /admin/v1/login 背后的完整链路(按执行顺序):
1 限流预检 IP + 用户名双维度 Redis 计数,锁定中直接 400(被封锁 IP 连用户表都不查)
2 图形验证码 Header 携带,Redis verify-and-delete(单次有效)
3 租户解析 tenant_code 空=平台登录;非 ON 租户统一文案拒绝
4 登录策略·全局段 IP / 时间窗 / 设备黑名单(白名单反向约束)
5 标识符反查 输入含 @ 走邮箱、纯数字走手机号,反查真实用户名
6 凭证校验 AES 解密入参 → bcrypt 比对;用户不存在也跑一次假 bcrypt(恒定时间防枚举)
7 纵深校验 凭证行租户必须等于用户行租户
8 登录策略·用户段 定向到具体用户的策略条目
9 授权丰富 角色链 → 权限码 → 管理员旗标 → 数据范围/字段黑名单进令牌
10 MFA 闸门 绑有 TOTP 则不发令牌,签发一次性挑战走二次验证
11 签发 access + refresh 双令牌(jti 关联,Redis 令牌对缓存)
