文档目录
访问控制

简介

本指南面向DouPHP的访问控制安全实践,覆盖身份认证、权限控制、会话与令牌管理、限流与防护头、第三方集成(OAuth/单点登录)以及异常检测与审计日志。文档基于仓库中实际实现进行说明,帮助开发者与安全运维人员正确配置与扩展系统的安全能力。

项目结构

DouPHP采用“端+中间件+服务”的分层组织:

  • 后台(admin):管理员认证、CSRF、模块级权限判定。
  • API(api):无状态会员鉴权、定向限流、统一错误响应。
  • 前台(front/_'module/user/front):会话式鉴权模式配置、敏感接口限流。
  • 核心(core):可参数化中间件接口、安全响应头基类、API Token签发等。
  • 配置(config):可信代理/Host、安全响应头、限流存储、会话Cookie硬化。
  • 第三方集成(plugin/*):如Google OAuth;小程序微信登录在api控制器中处理。
graph TB
subgraph "后台"
A["Admin Auth<br/>认证中间件"]
B["Admin Permission<br/>权限中间件"]
C["Admin Gate<br/>模块授权判定"]
D["Admin CSRF<br/>表单令牌校验"]
end
subgraph "API"
E["UserAuthMiddleware<br/>Bearer令牌解析"]
F["ThrottleMiddleware<br/>IP限流"]
end
subgraph "前台"
G["Front Throttle<br/>敏感端点限流"]
H["Auth Modes<br/>required/optional/public"]
end
subgraph "核心"
I["ParameterizedMiddleware<br/>路由级参数注入"]
J["SecurityHeaders<br/>安全响应头"]
K["ApiTokenService<br/>Token签发/清理"]
end
A --> B --> C
E --> F
G --> H
I --> E
I --> G
J --> A
J --> E
J --> G
K --> E

核心组件

  • 后台认证与权限
    • 认证中间件:从会话恢复管理员身份,未登录跳转登录页。
    • 权限中间件:依据当前模块/动作调用AdminGate判定是否放行。
    • AdminGate:维护子模块到父模块的鉴权别名,支持超级管理员白名单与action_list白名单。
  • API鉴权与限流
    • UserAuthMiddleware:从Authorization头提取Bearer token,交由auth('api')解析登录态,拒绝时返回401/403 JSON。
    • ThrottleMiddleware:按路由键对登录/注册/验证码/公共写接口/LLM端点进行IP限流,超限返回429并附带Retry-After。
  • 前台鉴权与限流
    • 鉴权模式:通过auth_modes声明模块/动作的public/optional/required及work_required策略。
    • 限流中间件:对敏感端点按IP限流,与登录失败限流互补。
  • 安全响应头与会话硬化
    • SecurityHeadersMiddleware:根据config下发X-Frame-Options、X-Content-Type-Options、Referrer-Policy、Permissions-Policy、HSTS等。
    • config/security.php:可信代理/Host、限流存储路径、会话Cookie策略(HttpOnly、Secure、SameSite、Strict Mode)。
  • 令牌与会话
    • ApiTokenService:为会员签发短期token,落库哈希值并清理过期行,支持多设备并存。
    • 前端小程序:本地持久化api_token与user_id,并在UNAUTHORIZED时清理登录态。

架构总览

下图展示请求进入后的安全管道:后台走认证→权限→工作区→CSRF;API走鉴权→限流;前台走鉴权模式→限流→安全头。所有端均受安全响应头保护。

sequenceDiagram
participant C as "客户端"
participant R as "路由/中间件"
participant A as "Admin Auth"
participant P as "Admin Permission"
participant G as "Admin Gate"
participant S as "CSRF"
participant U as "API UserAuth"
participant T as "API Throttle"
participant F as "Front Throttle"
participant H as "SecurityHeaders"
C->>R : HTTP请求
alt 后台
R->>A : 恢复管理员会话
A-->>R : 已登录/跳转登录
R->>P : 检查模块/动作
P->>G : canAccess(管理员, 模块, 动作, id)
G-->>P : 允许/拒绝
R->>S : 校验表单CSRF令牌
S-->>R : 通过/拒绝
else API
R->>U : 解析Bearer令牌
U-->>R : 用户上下文/拒绝401/403
R->>T : IP限流
T-->>R : 通过/429
else 前台
R->>F : 敏感端点限流
F-->>R : 通过/429
end
R->>H : 下发安全响应头
H-->>C : 响应

详细组件分析

身份认证与会话管理

  • 后台管理员登录
    • 认证中间件从会话恢复管理员身份,未登录抛异常重定向至登录页。
    • 登录路由组豁免auth/permission/workspace,避免死循环;login/post额外豁免csrf以支持匿名提交。
    • 找回密码使用一次性令牌password_reset,由CSRF中间件特殊识别。
  • 前台会员登录
    • LoginService负责凭据校验,不直接写session/cookie;成功/失败分别记录审计日志与登录失败计数。
    • 登录成功后由调用方写入会话或签发API token。
  • API无状态鉴权
    • UserAuthMiddleware从Authorization头取Bearer token,交由auth('api')解析用户上下文;拒绝时返回401/403 JSON。
    • ApiTokenService签发短期token,落库哈希并清理过期行,支持多设备并存。
  • 小程序会话
    • 本地持久化api_token与user_id;当收到UNAUTHORIZED时清理登录态,避免弱网误登出。
sequenceDiagram
participant U as "用户"
participant L as "LoginService"
participant A as "Admin Auth"
participant W as "API UserAuth"
participant T as "ApiTokenService"
participant M as "小程序"
U->>L : 提交账号密码
L-->>U : 成功/失败 + 审计日志
U->>A : 后台登录
A-->>U : 会话建立/跳转
U->>W : 携带Bearer token
W-->>U : 用户上下文/401/403
U->>T : 申请新token
T-->>U : 返回明文token
M->>M : 本地保存token并监听UNAUTHORIZED清理

权限控制系统(角色、资源、API访问)

  • 后台模块权限
    • 权限中间件读取当前模块/动作,调用AdminGate判定;超级管理员直接放行,其他管理员按action_list白名单判定。
    • AdminGate维护子模块到父模块的鉴权别名,确保新增子资源时继承父模块权限。
  • API访问控制
    • UserAuthMiddleware将Bearer token解析为用户上下文,结合业务策略决定work身份与资源访问。
    • 可通过ParameterizedMiddleware在路由级注入权限/限流参数,实现细粒度控制。
  • 前台鉴权模式
    • auth_modes集中声明模块/动作的访问级别(public/optional/required/work_required),新增需登录的模块必须显式登记。
flowchart TD
Start(["进入后台"]) --> CheckAdmin["管理员会话存在?"]
CheckAdmin --> |否| Redirect["重定向到登录页"]
CheckAdmin --> |是| CheckPerm["权限中间件: 模块/动作"]
CheckPerm --> Gate["AdminGate.canAccess()"]
Gate --> |允许| Next["继续处理"]
Gate --> |拒绝| Redirect

管理员账户安全(强密码、失败锁定、审计日志)

  • 登录失败处理与审计
    • LoginService在校验失败时调用登录失败计数并写入用户审计日志;成功则记录成功日志。
    • 小程序侧在UNAUTHORIZED时清理本地登录态,避免弱网导致的假登出抖动。
  • CSRF与表单安全
    • 后台CSRF中间件统一管理静态令牌static_admin,并对找回密码流程使用一次性令牌password_reset。
    • 登录相关路由通过声明式豁免避免中间件干扰。
  • 建议与实践
    • 启用会话严格模式与HttpOnly/Secure/SameSite策略,降低会话劫持风险。
    • 限制登录失败次数并结合IP限流,防止暴力破解。

API访问控制(密钥、签名、速率限制)

  • 令牌与鉴权
    • API使用Bearer令牌,UserAuthMiddleware解析并注入用户上下文;拒绝时返回标准JSON错误码。
    • ApiTokenService签发短期token,落库哈希并清理过期行,支持多设备并发。
  • 速率限制
    • API与前台均提供定向限流中间件,针对登录/注册/验证码/公共写接口/LLM端点进行IP限流,超限返回429并附带Retry-After。
  • 建议与实践
    • 对外暴露的API应仅开放必要端点,结合路由级参数化中间件实现更细粒度的rate limit与权限控制。
    • 生产环境开启可信代理与Host白名单,避免伪造请求头污染。

第三方集成安全(OAuth、单点登录、外部服务认证)

  • Google OAuth
    • 生成state并保存在Session,回调后完成授权流程;缺失配置时抛出异常提示管理员。
  • 微信小程序登录
    • 小程序端获取code并传回后端,后端调用微信接口换取session信息,绑定user_sns并返回登录结果。
  • 通用SNS登录流程
    • SnsLoginService根据openid/unionid查找关联用户,若已登录则绑定,否则自动注册或引导绑定。
sequenceDiagram
participant App as "小程序/前端"
participant GS as "GoogleService"
participant WX as "WeixinController"
participant SNS as "SnsLoginService"
App->>GS : 发起授权含state
GS-->>App : 跳转Google授权页
App->>WX : 小程序code换session
WX-->>App : 绑定user_sns/登录结果
App->>SNS : 解析SNS身份并落地
SNS-->>App : 跳转用户中心或绑定页

访问异常检测与威胁情报集成方案

  • 现有能力
    • 登录失败计数与审计日志:LoginService在失败时记录审计日志,便于后续分析与告警。
    • 限流与重试提示:ThrottleMiddleware在超限时返回429与Retry-After,抑制高频攻击。
    • 安全响应头:防点击劫持、嗅探、过度权限等。
  • 建议集成
    • 将审计日志接入SIEM/日志平台,设置阈值告警(如短时间内大量LOGIN_FAIL)。
    • 结合IP信誉库与威胁情报,对恶意IP段实施动态封禁或降权。
    • 对敏感操作(导出、备份、导入)强制CSRF与二次确认,并记录完整上下文。

依赖关系分析

  • 中间件耦合与职责边界清晰:认证、权限、限流、CSRF、安全头各司其职,通过路由级组合实现灵活策略。
  • 配置驱动:安全头、限流存储、会话策略集中在config/security.php,便于统一治理。
  • 可扩展性:ParameterizedMiddleware支持路由级参数注入,便于按需定制权限/限流策略。
graph LR
Config["config/security.php"] --> Headers["SecurityHeadersMiddleware"]
Config --> Session["会话策略"]
Route["路由配置"] --> Param["ParameterizedMiddleware"]
Param --> Auth["UserAuthMiddleware"]
Param --> Throttle["ThrottleMiddleware"]
AdminRoute["admin/route/login.php"] --> AdminAuth["Admin Auth"]
AdminAuth --> Perm["PermissionMiddleware"]
Perm --> Gate["AdminGate"]

性能与可用性

  • 限流存储:默认落盘于STORAGE_PATH下的throttle目录,注意磁盘IO与轮转清理策略。
  • 会话与令牌:ApiTokenService定期清理过期token,避免表膨胀;小程序侧仅在UNAUTHORIZED时清理本地态,减少弱网抖动。
  • 安全头:在命中路由的最前置下发,开销极低且提升整体安全性。
  • 建议:在高并发场景下评估限流存储后端(如Redis)与审计日志异步写入,降低主链路延迟。

故障排查指南

  • 后台无法登录或死循环
    • 检查登录路由是否豁免了auth/permission/workspace;确认CSRF令牌模型是否正确(static_admin/password_reset)。
  • API返回401/403
    • 确认Authorization头格式与token有效性;核对UserAuthMiddleware的resolveContext与reject逻辑。
  • 频繁429限流
    • 查看ThrottleMiddleware的路由键与配额;必要时调整窗口与max值,或优化客户端重试策略。
  • 第三方登录失败
    • 检查Google/微信配置是否完整;确认state保存与回调URL一致;核对user_sns绑定逻辑。

结论

DouPHP通过中间件链路与配置驱动实现了完善的访问控制体系:后台强调会话与权限白名单,API强调无状态令牌与限流,前台强调鉴权模式与敏感端点保护。配合安全响应头与会话硬化、第三方OAuth集成与审计日志,可满足多数企业级安全需求。建议在部署中启用可信代理/Host白名单、合理配置限流与审计告警,持续演进威胁情报联动机制。

附录

  • 关键配置项参考
    • 可信代理与Host白名单:config/security.php
    • 安全响应头:config/security.php → security.headers
    • 会话Cookie策略:config/security.php → security.session
    • 限流存储:config/security.php → security.throttle.store
  • 关键中间件清单
    • 后台:AuthMiddleware、PermissionMiddleware、CsrfMiddleware
    • API:UserAuthMiddleware、ThrottleMiddleware
    • 前台:ThrottleMiddleware、SecurityHeadersMiddleware
    • 核心:ParameterizedMiddleware、AbstractSecurityHeadersMiddleware
添加日期:2026-10-05