@astram/guard — 执行门+巢JS适配器
这个 执法门+薄巢JS集成 astram 框架——
可装入可装入可装入胶水的消费应用软件(它运行在/与NestJS集成). 人数
ADR-0023 (英语)
这是 框架代码, 自有 + 锁定,不能消费-编辑:它生活在
消费者 node_modules,并升级流经 npm update它取决于
@astram/core (框架-不可知内核)和PEER-依赖
主机"巢穴JS"运行时间.
这里面是什么
| 块 | 文件 | 目的 |
|---|---|---|
ShieldModule | src/module/shield.module.ts | 这个 一个注册接头 —— 说 forRoot() 编号 : forRootAsync()消费者进口一次;框架拥有构成. |
| 全球执法警卫 | src/enforcement/global-enforcement.guard.ts | 逐一否认 APP_GUARD (ADR-0002)每条路线都经过. |
| 分类装饰 | src/enforcement/classification.decorator.ts | @Public() 编号 : @Classified() 消费者作者在控制器上写这些. |
| 核心连接 | src/enforcement/core-seam.ts | 仅导入类型 @astram/core是因为 DecisionAuthority (ADR-0003) + 故障闭塞活塞. |
| 靴子池论 | src/boot/boot-sequence.ts | ATR-0018 连接池预算在启动时检查(未关闭). |
| 应用配置 | src/config/app-config.ts | 港口/环境/ADR-0018池预算(env加载器,纯). |
| 请求本金 | src/request-auth/request-principal-als.ts | 只读 currentRequestPrincipal(): 当前的请求 { tenantId, userId } (下关. |
登记连接(ADR-0023§4)
一个消费者应用 电线Astram与一个 单导入 在其根模块中,它从来没有 编辑框架 :
import { Module } from '@nestjs/common';
import { ShieldModule } from '@astram/guard';
@Module({
imports: [
ShieldModule.forRoot(), // fail-closed stub authority; env-loaded config
// ShieldModule.forRoot({ decisionAuthority, config }) to supply the real Core authority
],
controllers: [/* the consumer's feature controllers */],
})
export class AppModule {}
forRoot() 绑定 :
GlobalEnforcementGuard作为APP_GUARD· 全球、结构上不可避免, 拒绝逐一执行点(ADR-0002).@Public()是唯一的选择退出; 未分类的路由是 被拒绝(403)。 。 。 .- 决心
AppConfig(单位:千美元)APP_CONFIG+ 该BootSequence钩子, 运行 ADR-0018 (英语) (b) 启动时的集合预算主张(违规行为). - 这个 核心决定权 (单位:千美元)
SHIELD_DECISION_AUTHORITY)——真实的@astram/core授权通过forRoot({ decisionAuthority }),则 关闭失败 树枝 (deny-by-default),所以误拨不能打开一扇门.
forRootAsync({ useFactory, inject, imports }) 由 DI 计算成的变体( stub)
在此层中: 工厂在启动时解决相同的选项; 守护/启动
接线相同.
请求本金currentRequestPrincipal(中文(简体) )
import { currentRequestPrincipal } from '@astram/guard';
const p = currentRequestPrincipal(); // Readonly<{ tenantId: string; userId: string }> | undefined
在请求中运行但没有的框架代码 req 手持(例如 @astram/agent是因为
createAuditedFetch)在这里读到打电话者的房客和校长的ID. 谱:
docs/features/capability-outbound-audit/SPEC.md v6 第5节 G.
- 唯相读取. 框架中间软件( Name
EnforcementModule,每条路线)打开一个模块-私人AsyncLocalStorage每个请求都有空的持有人。 全球执法卫队是唯一 写入器:一次,在允许路径上,在认证后,从主端解出 会话或 API 密钥( 绝不来自正文、 标题或查询) 。 值被冻结。 存储,存储 中间软件和写入器不导出,因此应用程序代码不能输入范围或覆盖范围. undefined在请求(预定工作)之外@Public()路径,用于请求 警卫拒绝了 请求没有通过中间软件.userId是主要编号: 用户或服务账户. 值没有说明是哪一种 (GAPS #46); 需要时查查ID.- 在请求的同步上下文之外恢复工作(例如一些溪流消费者)读取
undefined,从没有另一个请求的值(一个交互的4个请求测试持有这个). 读吧 在请求自己的调用链中; 由共享代码运行的调用( 一个全应用程序发送器上的收听器) 所以不要在那里读它. - 在启动时启动背景工作( E)
onApplicationBootstrap永远不要懒散 从内心 请求. 请求内创建的 Async 资源( 计时器、 承诺链、 队列排出) a 处理器从第一次使用开始)保留该请求的背景,包括其主要内容或缺乏 一个. - 排除路线
app.setGlobalPrefix(prefix, { exclude })也通过中间软件( e2e) 测试这个. @astram/guard/internal(仅使用框架)还输出只读insideRequest()数字 :true在通过中间器件的请求中, 无论有没有本金.@astram/agent是因为 已审计的获取器使用它拒绝来自@Public()并拒绝了请求.- 唯快报.
currentRequestPrincipal证明在@nestjs/platform-express; 快捷为 在它拥有自己的e2e测试之前不支持. - 只有巢穴路线. 持枪者由一个巢穴中间器件打开,所以直接挂载在
hTTP 适配器( 在 Nest 路由之外) 运行“ 在请求之外 ” :
insideRequest()实值false财务报告和审定财务报表@astram/agent是因为createAuditedFetch将预定的工作分支放在那里(应用程序必须到此为止) 提供服务器持有的租户)。 在 Nest 处理器或启动的任务中保留连接器代码 . - 仅在内存中:请求路径(Shield #12)中没有添加数据库或已读的 Redis .
文件共享端口符 (P)SHIELD_FILE_SHARE,GAPS#57 (中文(简体) )
src/module/shield-tokens.ts 宣布该港口为警卫,绝不进口身份(ADR-0003);
@astram/identity 按要求绑定 光谱 docs/features/file-share-port/SPEC.md v1, ADR- 0040 (英语)
增编(2026-11-03).
- 输出 :
SHIELD_FILE_SHARE联合国Symbol,没有身份限制,FileSharePort(单位:千美元)shareWithRole, (中文(简体) ),unshare, (中文(简体) ),revokeForParent, (中文(简体) ),listForParent, (中文(简体) ),reconcileFile没有演员, 租户、业主或公司的论点),FileShareParent(单位:千美元){ typeKey, id }, (中文(简体) ),FileShareResult(单位:千美元){ created, effective, missing }, (中文(简体) ),FileShareError, (中文(简体) ),FILE_SHARE_ERROR_CODES, (中文(简体) ),FileShareErrorCode。 。 。 . FileShareError(code)仅取代码,所以其信息从不带id、文件名或 表格显示:file_share_invalid400个Invalid file share request., (中文(简体) ),file_share_not_found404 (韩语)Not found., (中文(简体) ),file_share_denied403 (韩语)Not permitted., (中文(简体) ),file_share_unavailable第503条File sharing is unavailable.; 未知代码变为file_share_unavailable。 。 。 .- 移徙
1710000000126-AddRecordShareSource.cjs添加源列 (单位:千美元)rs_source_type_key, (中文(简体) ),rs_source_record_uuid, (中文(简体) ),rs_source_operation, (中文(简体) ),''- 股权,ck_rs_source_complete, (中文(简体) ),uq_rs_grant_source(替换)uq_rs_grant和idx_rs_source· ;down当端口行存在时拒绝. RecordShareWriter: 拥有者unshare只删除所有者制作的行并拒绝翻转 仅匹配端口行ShareNotPermittedError(SHARE_MANAGED_BY_LINKED_RECORD)(单位:千美元)This share is managed by a linked record.); 列表行(RecordShareRow携带源字段;listSharesForAuthorizedRecord列出一个记录的股票 不受所有者约束, 对于一个呼叫者 已经证明权威decide()(身份是存储文件管理员列表).
同伴依赖关系(ADR-0023§2)
@astram/guard 对等依赖 在主机运行时间,所以消费者 完全拥有
一份(单份) reflect-metadata 单通/DI注射器:
@nestjs/common ^11 · @nestjs/core ^11 · reflect-metadata ^0.2 · rxjs ^7
这些也是 devDependencies 在这里,软件包会本地化 + 测试 .
@astram/core 是真实的(工作空间) 依赖性。 。 。 .
图标
pnpm --filter @astram/guard build # tsc -p tsconfig.build.json (emits dist + .d.ts)
pnpm --filter @astram/guard lint # eslint
pnpm --filter @astram/guard test # vitest run (guard unit + boot-pool + forRoot e2e)
页:1
- 常见JS 当地(
"type": "commonjs"),用于雀巢JS装饰机+reflect-metadataDI型号. 复发根和@astram/core保持无害环境管理/节点; 覆盖范围为此软件包(参见tsconfig.json) (中文(简体) ). - 核心接合导入真实
@astram/core枪管 (类型只) — Core'sexports仅显示地图".",因此子路径导入失败了节点解析. 这个 软件包的 tsconfig 清除了底部paths这样@astram/core解决 节点 模块工作空间同 Core 已建dist。 。 。 .