# 权限与信任边界

manifest/宿主权限交集、可撤销身份、UI 角色，以及插件、AI 和服务器的独立控制。

版本、变更与要求见 [Framework 3.2 与 CLI 1.0](/zh-cn/docs/guides/releases/)。


<span id="autoridad-efectiva"></span>

<span class="section-anchor" id="section-1"></span>

## 有效权限

WU 将 manifest 请求与 shell grants 的交集作为权限。没有请求或 grants 时，应用不会获得技术 capabilities。添加应用未请求的 grant 也不会扩大其权限。

```json
{
  "name": "cart",
  "entry": "assets/cart.js",
  "wu": {
    "permissions": [
      { "capability": "store.read", "resource": "cart", "required": true },
      { "capability": "store.write", "resource": "cart.items", "required": true },
      { "capability": "events.emit", "resource": "cart:changed" }
    ]
  }
}
```

```js
await wu.init({
  apps: [{
    name: 'cart',
    url: '/apps/cart',
    grants: [
      { capability: 'store.read', resource: 'cart' },
      { capability: 'store.write', resource: 'cart.items' },
      { capability: 'events.emit', resource: 'cart:changed' },
    ],
  }],
});
```

`required: true` 要求请求被完整覆盖才能注册应用。可选请求可能被拒绝或仅部分覆盖；策略会保留诊断。可选并不意味着首次调用时就会自动授权。

<span id="capacidades-técnicas-admitidas"></span>

<span class="section-anchor" id="section-2"></span>

## 支持的技术 capabilities

| 能力 | 操作 |
| --- | --- |
| `events.emit` | 在获授权资源上发射事实事件 |
| `events.subscribe` | 订阅允许的事件 |
| `rpc.provide` | 提供总线 handlers 和方法契约 |
| `rpc.call` | 请求响应并使用契约 |
| `store.read` | 读取、获取快照并订阅路径 |
| `store.write` | 对路径执行写入和 batch |
| `drag.offer` | 在拖动中提供某一类型的数据 |
| `drag.accept` | 在放置目标接受某一类型的数据 |

`store.update` 同时需要读取和写入权限。不存在任意的 `device.*`、`deploy.*` 或 `build.*` grants；列表在 `wu-policy.js` 中固定定义。

资源使用精确字符串或末尾通配符。对于 store，通配符必须占据完整路径段，如 `cart.*`。`wu:`、`system:` 和 `app:` 是事件发射与 RPC 提供/调用的保留命名空间。`events.emit:*` 请求会与它们重叠，不能用来授予全部宿主权限。

<span id="identidad-durante-el-lifecycle"></span>

<span class="section-anchor" id="section-3"></span>

## 生命周期中的身份

core 为每个应用创建 lease，并提供冻结的 facade。每个方法检查 lease 是否仍有效；函数附加正确身份，不允许应用通过更改 `appName` 冒充其他应用。

卸载会撤销 facades 并清理关联资源。通过 facade 使用的契约也会被包装，在撤销后失败。全局变量保存的旧 facade 不会在同名应用重新挂载时恢复权限：新的生命周期会创建新身份。

在 4.0 中，全部十三个 adapters 的事件/store hooks 都遵循应用 facade。这保护了合作式调用，但 `module` 共享 realm，仍可访问 host。Shadow DOM 和同源沙箱无法隔离恶意代码；需要该边界时，应使用另一 origin 上的远程应用。

<span id="cuatro-controles-diferentes"></span>

<span class="section-anchor" id="section-4"></span>

## 四类不同的控制

| 控制 | 决定什么 | 不决定什么 |
| --- | --- | --- |
| WU 技术 grants | 总线、RPC 和 store 路径的使用 | 后端数据访问 |
| `setPrincipal` / 角色 | 应用是否可以在 UI 中挂载 | 服务器上可靠的用户授权 |
| 插件权限 | 安装 API 提供哪些方法 | 约束已在宿主中执行的代码 |
| AI flags | AI actions 的读取、写入、DOM、网络或执行 | 远程操作的领域权限 |

插件配置使用另一份列表：`mount`、`events`、`store`、`apps`、`config`、`unsafe`。宿主必须明确授予请求的权限。AI actions 使用 `executeActions`、`writeStore` 和 `network` 等 flags。这些列表不能相互替代。

<span id="frontera-del-servidor"></span>

<span class="section-anchor" id="section-5"></span>

## 服务器边界

凭据、资源访问、幂等性和持久审计属于经过身份验证的服务。action handler 是宿主代码，可以在闭包中捕获 `fetch` 或高权限客户端；向 handler 提供的 API 无法约束该闭包。

对于具有副作用的操作，应设计 gateway，在执行前验证身份、参数、范围、策略和审批。Timeline 和 store 不会撤销发送、付款、build 或基础设施变更。如果领域允许撤销，需要实现明确的补偿操作。

`wu-framework/server` subpath 提供 `createNonce`、`securityHeaders`、`buildCsp`、middleware 和响应 wrappers。这些 helpers 构建响应头；实际安装由提供页面和资源的服务器负责。

<span id="migración-controlada"></span>

<span class="section-anchor" id="section-6"></span>

## 受控迁移

```js
await wu.init({
  compatibility: { profile: 'compat-v2', warnings: 'once' },
  apps: [],
});
console.table(wu.compatibility.getMigrationReport());
```

compat-v2 配置档启用针对 eventPermissions、插件隐式 grants 和 AI actions 隐式执行的特定兼容桥接。这是带诊断的显式迁移，不应成为新应用的基础配置。`strictEvents: false` 也是为可信代码提供的显式绕行选项，会减少总线检查。

<span id="referencia-de-implementación"></span>

<span class="section-anchor" id="section-7"></span>

## 实现参考

策略：`src/core/wu-policy.js`、`src/core/wu-policy.js`、`src/core/wu-policy.js`；leases：`src/core/wu-core.js` 和 `src/core/wu-core.js`；插件：`src/core/wu-plugin.js`；AI 默认值：`src/ai/wu-ai-permissions.js`；兼容性：`src/core/wu-compatibility.js`。测试：`tests/unit/capability-security-v3.test.js`、`tests/unit/plugin-security.test.js`、`tests/unit/security-regressions.test.js`、`tests/security/compatibility-boundaries.test.js`。