AdminLoginController(管理员登录与注销)¶
提供管理控制台的入口重定向、管理员登录与注销:访问模块根路径重定向到 index.html;登录端点校验用户名 / 密码 / 验证码(连续输错 2 次以上强制校验图片验证码),签发 adminToken(JWT,HMAC256)并写入 Cookie 与响应 JSON;注销端点把 token 加入黑名单、清空 Cookie。
- 类级基址:
${myapps.context-path.manager:}(注意:控制器类级@RequestMapping直接是 context-path,方法级路径为完整相对路径,**不**带/api/authtime前缀) - Tag:登录和注销模块(源码
@Tag(name = "登录和注销模块")) - 控制器源码:
obpm-manager/src/main/java/cn/myapps/manager/authtime/controller/admin/AdminLoginController.java - 公共说明:
- 类继承
BaseAuthTimeController,通过其success(errmsg, data)/error(errcode, errmsg, errors)返回统一Resource(字段errcode/errmsg/data/errors,结构见 ../index.md「统一响应结构」)。 - 登录端点返回
JSONObject(非统一Resource),自定义结构字段:code("0"成功,"1"失败)、msg、adminToken(成功时附)、checkcodeImg(需图片验证码时附 base64)。 - 鉴权豁免:本控制器全部 3 个端点均在
CommWebMvcConfig的filterRegistrationBeanPassFilter1白名单中(详见 index.md「鉴权豁免」):GET /与GET /:匹配白名单/、/manager、/manager/;POST /api/authtime/login:匹配白名单/api/authtime/login/*与/manager/api/authtime/login/*(lite 部署);POST /api/authtime/logout:匹配白名单/api/authtime/logout与/manager/api/authtime/logout。
- 故三个端点**均豁免 adminToken**(无需登录即可访问),下文逐端点标注「否(豁免)」。
- 密码前端做轻量混淆:取密码末两位挪到前面再做 BASE64 解码(非真加密)。
- 错误次数累计:用户
DomainVO存在时记录到SuperUserVO.pwdErrorTimes;用户不存在时记录到名为<username>_errTimes的 Cookie。累计 2 次以上返回验证码图片、3 次以上校验验证码、超过 10 次锁定账号 30 分钟。
1. 访问主页面¶
访问模块根路径,控制器内部 302 重定向到 <当前 URI>/index.html(去重 //)。
- 接口类型:页面视图(302 重定向)
- 请求方式:
GET - 请求路径:
/或`(完整:/或`) - 鉴权:否(豁免,匹配白名单
/、/manager、/manager/) - Tag:登录和注销模块
请求参数¶
无。
请求示例¶
响应¶
- 状态码:302 Found
- 响应头:
Location: <当前 URI>/index.html(如/index.html) - 响应体:无(重定向)
注:方法返回
void,由response.sendRedirect(url)直接控制响应。
2. 管理员登录¶
按用户名 / 密码(前端轻量 BASE64 混淆)/ 验证码校验。连续输错后强制要求图片验证码(base64 内联返回),超 10 次锁定 30 分钟。校验通过后 Security.generateToken(userId) 签发 adminToken JWT,Cookie 与 JSON 双路下发。
- 接口类型:REST 资源
- 请求方式:
POST - 请求路径:
/api/authtime/login(完整:{manager-context}/api/authtime/login) - 鉴权:否(豁免,匹配白名单
/api/authtime/login/*) - Tag:登录和注销模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| content | body | JSON | 是 | 登录请求包体(字段见下) |
请求体¶
JSON 对象(application/json):
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| username | string | 是 | 登录账号(超级管理员 / 域管理员 / 系统管理员等) |
| password | string | 是 | 密码(前端 BASE64 混淆:取末两位挪到前面,再 BASE64 解码) |
| checkcode | string | 视情况 | 图片验证码(连续输错 3 次以上必填,否则忽略) |
请求示例¶
POST /api/authtime/login HTTP/1.1
Content-Type: application/json
{ "username": "admin", "password": "YWRt+W4=", "checkcode": "abcd" }
响应¶
结构:自定义 JSONObject(非统一 Resource),字段:
| 字段 | 类型 | 说明 |
|---|---|---|
| code | string | 结果码,"0" 成功,"1" 失败 |
| msg | string | 提示信息(成功为 登录成功;失败为国际化文案,默认 账号或密码错误,或账号未激活 / 输入字符错误,请重新输入图片中出现的4个字符) |
| adminToken | string | 成功时附带的 JWT(仅 code=0 时出现) |
| checkcodeImg | string | 需要图片验证码时附带的 base64 数据 URI(data:image/jpg;base64,...) |
| 条件 | code | msg | 附加字段 |
|---|---|---|---|
| 登录成功 | 0 |
登录成功 |
adminToken: <jwt> + 响应头 Set-Cookie: adminToken=<jwt>; Path=/; HttpOnly |
| 错误次数 ≥ 2(含首次校验失败) | 1 |
账号或密码错误,或账号未激活 |
checkcodeImg: <base64> |
| 错误次数 > 2 且验证码不匹配 | 1 |
输入字符错误,请重新输入图片中出现的4个字符 |
checkcodeImg: <base64> |
| 账号锁定(30 分钟内) | 1 |
账号或密码错误,或账号未激活 |
视累计次数附 checkcodeImg |
| 抛异常 | 1 |
账号或密码错误,或账号未激活 |
累计错误次数 +1 |
注:响应码字段为字符串
"0"/"1",不是数字 0 / 1(与统一Resource的errcode数字不同)。
成功示例:
HTTP/1.1 200 OK
Set-Cookie: adminToken=eyJhbGciOiJIUzI1NiJ9...; Path=/; HttpOnly
Content-Type: application/json
{ "code": "0", "msg": "登录成功", "adminToken": "eyJhbGciOiJIUzI1NiJ9..." }
3. 管理员注销¶
按 adminToken 解析管理员 id,从 AuthTimeServiceManager 移除当前用户、把 token 加入黑名单缓存(AuthTimeServiceManager.setBlackList),并通过 Set-Cookie 把 adminToken 置空 + maxAge=0 清空浏览器 Cookie。
- 接口类型:REST 资源
- 请求方式:
POST - 请求路径:
/api/authtime/logout(完整:{manager-context}/api/authtime/logout) - 鉴权:否(豁免,匹配白名单
/api/authtime/logout) - Tag:登录和注销模块
注:注销端点本身豁免 adminToken,但端点内仍调用
Security.getAdminIdFromToken(request)解析用户 id;token 缺失或失效时adminId为null,removeAdminUser(null)与setBlackList行为由下层实现决定(不阻断返回成功)。
请求参数¶
无(仅依赖请求携带的 adminToken,详见 index.md「adminToken 传递方式」)。
请求示例¶
响应¶
结构:统一 Resource。
data:null。
| 条件 | errcode | errmsg | data |
|---|---|---|---|
| 成功 | 0 | ok | null |
| 抛异常 | 500 | <异常信息> |
null |
成功示例:
HTTP/1.1 200 OK
Set-Cookie: adminToken=; Path=/; Max-Age=0
Content-Type: application/json
{ "errcode": 0, "errmsg": "ok", "data": null, "errors": null }