Files
soul-yongping/soul-api/管理端鉴权设计.md
2026-03-07 22:58:43 +08:00

3.4 KiB
Raw Blame History

soul-api 管理端登录判断与权限校验

一、有没有登录的依据JWT

依据:请求中的 JWT。优先从 Authorization: Bearer <token> 读取,兼容从 Cookie admin_session 读取。

项目 说明
推荐方式 请求头 Authorization: Bearer <JWT>
兼容方式 Cookie 名 admin_session,值为 JWT 字符串
JWT 算法 HS256密钥为 ADMIN_SESSION_SECRET
有效期 7 天exp claim
载荷 sub=admin, username, role=admin
校验 验签 + 未过期 → 视为已登录
  • 配置:ADMIN_USERNAME / ADMIN_PASSWORD 用于登录校验;ADMIN_SESSION_SECRET 用于签发/校验 JWT。
  • 未带有效 JWT → 401。

二、权限校验设计(路由分层)

  • 不校验登录:只做业务逻辑(登录、登出、鉴权检查)

    • GET /api/admin → 鉴权检查(读 Cookie有效 200 / 无效 401
    • POST /api/admin → 登录(校验账号密码,写 Cookie
    • POST /api/admin/logout → 登出(删 Cookie
  • 必须已登录:挂 AdminAuth() 中间件,从请求读 admin_session 并验签+过期,不通过直接 401不进入 handler

    • /api/admin/*(如 chapters、content、withdrawals、settings 等)
    • /api/db/*
  • 其它:如 /api/miniprogram/*/api/book/* 等不加 AdminAuth按各自接口鉴权如小程序 token


三、框图

flowchart TB
  subgraph 前端["soul-admin 前端"]
    A[用户打开后台 / 请求接口]
    A --> B{请求类型}
    B -->|登录| C[POST /api/admin]
    B -->|登出| D[POST /api/admin/logout]
    B -->|进后台前检查| E[GET /api/admin]
    B -->|业务接口| F[GET/POST /api/admin/xxx]
  end

  subgraph 请求["每次请求"]
    G[浏览器自动携带 Cookie: admin_session]
    G --> H[发往 soul-api]
  end

  subgraph soul-api["soul-api 路由"]
    I["/api/admin 三条(无中间件)"]
    J["/api/admin/* 与 /api/db/*"]
    J --> K[AdminAuth 中间件]
  end

  subgraph 鉴权["AdminAuth 与 AdminCheck 逻辑"]
    K --> L[从请求读 Cookie admin_session]
    L --> M{有 Cookie?}
    M -->|无| N[401 未授权]
    M -->|有| O[解析 exp.signature]
    O --> P{未过期 且 验签通过?}
    P -->|否| N
    P -->|是| Q[放行 / 返回 200]
  end

  C --> I
  D --> I
  E --> I
  F --> J
  H --> soul-api
  I --> E2[GET: 同鉴权逻辑 200/401]
  I --> C2[POST: 校验账号密码 写 Cookie]
  I --> D2[POST: 清 Cookie]

路由与中间件关系(框线):

flowchart LR
  subgraph 无鉴权["不经过 AdminAuth"]
    R1[GET  /api/admin]
    R2[POST /api/admin]
    R3[POST /api/admin/logout]
  end

  subgraph 需登录["经过 AdminAuth"]
    R4["/api/admin/chapters"]
    R5["/api/admin/withdrawals"]
    R6["/api/admin/settings"]
    R7["/api/db/*"]
  end

  subgraph 中间件["AdminAuth()"]
    M[读 Cookie → 验 token → 通过/401]
  end

  H1[直接进 handler]
  H2[通过则进 handler]
  无鉴权 --> H1
  需登录 --> M --> H2

四、相关代码位置

作用 位置
JWT 签发/校验/从请求取 token internal/auth/adminjwt.go
登录、登出、GET 鉴权检查 internal/handler/admin.go
管理端中间件 internal/middleware/admin_auth.go
路由挂载 internal/router/router.goapi.Group + admin.Use(AdminAuth())