permission-core Auth 接入
本示例展示如何把 permission-core 接入 VextJS Auth。Vext 的认证与路由保护是分层的:
auth()负责解析 Bearer token,并填充req.auth。permission-core负责invoke + GET:/api/posts这类授权判断。- 一个轻量 route helper 负责把业务权限映射为
RouteOptions.auth,避免每个路由重复写认证中间件和资源字符串。
已验证的外部消费者项目是 vext-test:对应 src/plugins/permission.ts、src/middlewares/permission-core-auth.ts、src/routes/auth-context.ts,以及 verify.mjs 的 #246-#250。
1. 安装
演示或测试项目可以使用 MemoryAdapter。生产环境请按 permission-core 生产部署文档选择持久化 storage adapter,并接入 permission-core 推荐的 cache-hub + monsqlize 栈。
2. 创建 permission 插件
3. 用 auth() 连接 permission-core
在 src/config/default.ts 注册中间件名:
4. 集中封装路由权限策略
不要在每个 route 里重复写 middlewares: ["permission-core-auth"] 和裸资源字符串。认证桥接中间件只注册一次,然后把路由保护形状集中到一个策略 helper:
这样权限词汇和资源命名只有一个真相源。项目里如果还有用户、账单等资源族,继续扩展 requireUserPermission()、requireBillingPermission(),而不是把裸 permission tuple 散落到 handler 周围。
5. 用策略 helper 保护路由
RouteOptions.auth 仍然是路由保护契约,但大多数应用应通过本地 helper 间接使用它,避免 middleware 名称、安全方案和权限资源漂移。旧的 openapi.guardSecurityMap 仍可兼容只靠 middleware 名称推断 security 的历史路由,但新代码应把 security 写在 helper 内的 auth.security,让运行时保护和 OpenAPI 输出共用同一个真相源。
6. 在 handler 内直接 assert()
只有当某条路由需要在 handler 内做额外动态判断时,才使用 req.auth.assert():
如果 permission-core 拒绝该操作,Vext 会沿 Auth guard 路径返回 AUTH_FORBIDDEN。
7. 验证
同一接入链路已经由 vext-test 覆盖:
相关断言如下:
#246身份填充与安全 request context 快照#247permission-corecan()放行#248permission-corecan()拒绝#249缺失、malformed、unknown token 错误码#250req.auth.assert()与 OpenAPIbearerAuth