メインコンテンツまでスキップ

ポリシーを追加する

新しいリソースの認可を 4 ステップで追加します。

1. 手形を作成する

authz/document-access.tegata.json を書きます。

{
"tegata": "0.1",
"policy": { "id": "document-access" },
"attributes": {
"subject.user_id": "string",
"resource.owner_id": "string"
},
"rules": [
{
"id": "allow-member-access-own-document",
"effect": "allow",
"subject": { "roles": ["member"] },
"actions": ["view", "edit"],
"resource": { "type": "document" },
"relationships": [
{ "label": "ownership", "subject_attribute": "user_id", "op": "eq", "resource_attribute": "owner_id" }
]
}
]
}

relationships はサブジェクト属性とリソース属性を比較します。全フィールドと評価規則は 手形スキーマ を参照してください。

2. 語彙を更新する(必要なら)

authz/vocabulary.json がある場合は新しい語を追加します。宣言していない語はコンパイル時に拒否されます。

{ "roles": ["member"], "actions": ["view", "edit"], "resource_types": ["document"], "attributes": {} }

3. コンパイルする

npx ninka compile

authz/out/(新しいポリシーの型を含む types.gen.ts など)が再生成されます。生成ファイル を参照してください。

4. check() を呼ぶ

import { check, policies } from "@/lib/authz";

const allowed = await check(policies.documentAccess, {
subject: { properties: { roles: session.user.roles, user_id: session.user.id } },
action: { name: "edit" },
resource: { type: "document", properties: { owner_id: doc.ownerId } },
});
if (!allowed) return NextResponse.json({ error: "forbidden" }, { status: 403 });

以上です。

関連項目