基于资源的授权

核心概念

授权以**路由模式**(route pattern)为资源键:

实际请求: GET /api/users/abc-123
资源键:   /api/users/{id}    ← route_pattern()

用户的 roles/permissions 与资源键匹配决定是否允许访问。

ResourceAuthorization

use webx::authz::ResourceAuthorization;

let policy = ResourceAuthorization::new()
    .allow_role("/api/admin/**", "admin")
    .allow_role("/api/users/{id}", "user");
    // .allow_permission(...) — 需 claims 侧支持对应 permission

HostBuilder 集成

Host::builder()
    .add_authentication()
    .use_resource_authorization()  // 从 #[authorize] 元数据构建策略
    .build()

`use_resource_authorization()` 在 **endpoint 层**执行策略(路由匹配后、`route_pattern()` 可用),而非 pipeline 中间件层。这避免了 `resource_auth_middleware` 在路由匹配前无法获知 pattern 的问题。

当前 HTTP 应用的常见做法:

- `add_authentication()` → JWT 中间件 - `#[authorize]` / `#[authorize(role = "…")]` / `#[authorize(permission = "…")]` → endpoint 内检查 - `.use_resource_authorization()` → 可选,从编译期元数据构建 `ResourceAuthorization` - `IDynamicAuthorizer` → docbit 等应用的自定义策略(如 `RoleAuthorizer`)

手动 middleware(高级)

`resource_auth_middleware` 仍可用于自定义 `IAuthorizationPolicy`,但须在路由匹配之后才能读取 `route_pattern()`。框架内置的 `.use_resource_authorization()` 已在 endpoint 层处理此场景。

通配符

`/**` 匹配所有子路径:

.allow_role("/api/admin/**", "admin")

小结

资源授权将路由模式与用户身份关联,实现声明式访问控制。通过 `.use_resource_authorization()` 可从 `#[authorize]` 元数据自动构建策略。

下一节:[authorize 宏与声明式授权](authorize-macro.md)