跳转至

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" 失败)、msgadminToken(成功时附)、checkcodeImg(需图片验证码时附 base64)。
  • 鉴权豁免:本控制器全部 3 个端点均在 CommWebMvcConfigfilterRegistrationBeanPassFilter1 白名单中(详见 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:登录和注销模块

请求参数

无。

请求示例

GET / HTTP/1.1

响应

  • 状态码: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(与统一 Resourceerrcode 数字不同)。

成功示例

HTTP/1.1 200 OK
Set-Cookie: adminToken=eyJhbGciOiJIUzI1NiJ9...; Path=/; HttpOnly
Content-Type: application/json

{ "code": "0", "msg": "登录成功", "adminToken": "eyJhbGciOiJIUzI1NiJ9..." }
失败示例
{
  "code": "1",
  "msg": "账号或密码错误,或账号未激活",
  "checkcodeImg": "data:image/jpg;base64,/9j/4AAQ..."
}


3. 管理员注销

adminToken 解析管理员 id,从 AuthTimeServiceManager 移除当前用户、把 token 加入黑名单缓存(AuthTimeServiceManager.setBlackList),并通过 Set-CookieadminToken 置空 + maxAge=0 清空浏览器 Cookie。

  • 接口类型:REST 资源
  • 请求方式POST
  • 请求路径/api/authtime/logout(完整:{manager-context}/api/authtime/logout
  • 鉴权:否(豁免,匹配白名单 /api/authtime/logout
  • Tag:登录和注销模块

注:注销端点本身豁免 adminToken,但端点内仍调用 Security.getAdminIdFromToken(request) 解析用户 id;token 缺失或失效时 adminIdnullremoveAdminUser(null)setBlackList 行为由下层实现决定(不阻断返回成功)。

请求参数

无(仅依赖请求携带的 adminToken,详见 index.mdadminToken 传递方式」)。

请求示例

POST /api/authtime/logout HTTP/1.1
Cookie: adminToken=eyJhbGciOiJIUzI1NiJ9...

响应

结构:统一 Resourcedatanull

条件 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 }
失败示例
{ "errcode": 500, "errmsg": "<异常信息>", "data": null, "errors": null }