ReBAC(関係ベースアクセス制御)
概要
ReBAC(Relationship-Based Access Control)APIは、Google Zanzibarにインスパイアされた関係ベースのアクセス制御を実装するためのエンドポイントを提供します。オブジェクト間の関係を定義し、その関係に基づいて権限を評価します。
エンドポイント一覧
| メソッド | エンドポイント | 説明 |
|---|---|---|
| GET | /api/admin/rebac/relation-definitions | 関係定義一覧取得 |
| POST | /api/admin/rebac/relation-definitions | 関係定義作成 |
| PUT | /api/admin/rebac/relation-definitions/:id | 関係定義更新 |
| DELETE | /api/admin/rebac/relation-definitions/:id | 関係定義削除 |
| GET | /api/admin/rebac/tuples | 関係タプル一覧取得 |
| POST | /api/admin/rebac/tuples | 関係タプル作成 |
| DELETE | /api/admin/rebac/tuples | 関係タプル削除 |
| POST | /api/admin/rebac/check | 権限チェック |
| POST | /api/admin/rebac/expand | 関係展開 |
Zanzibar DSL
Authrimは、Google Zanzibarスタイルの関係定義言語をサポートしています。
基本構文
definition <object_type> { relation <relation_name>: [<subject_type>] permission <permission_name> = <relation> | <expression>}例:ドキュメント共有
definition user {}
definition group { relation member: [user]}
definition document { relation owner: [user] relation editor: [user, group#member] relation viewer: [user, group#member]
permission edit = owner | editor permission view = edit | viewer}関係定義一覧取得
テナントで定義されている関係定義の一覧を取得します。
エンドポイント
GET /api/admin/rebac/relation-definitions
クエリパラメータ
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
limit | integer | - | 取得件数(デフォルト: 50) |
cursor | string | - | ページネーションカーソル |
object_type | string | - | オブジェクト種別でフィルタ |
リクエスト例
curl -X GET "https://{tenant-domain}/api/admin/rebac/relation-definitions" \ -H "Authorization: Bearer {token}"レスポンス例
{ "items": [ { "id": "reldef_doc", "object_type": "document", "relations": [ { "name": "owner", "subject_types": ["user"] }, { "name": "editor", "subject_types": ["user", "group#member"] }, { "name": "viewer", "subject_types": ["user", "group#member"] } ], "permissions": [ { "name": "edit", "expression": "owner | editor" }, { "name": "view", "expression": "edit | viewer" } ], "created_at": 1705881600, "updated_at": 1705968000 } ], "total": 5}関係定義作成
新しい関係定義を作成します。
エンドポイント
POST /api/admin/rebac/relation-definitions
リクエストボディ
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
object_type | string | ○ | オブジェクト種別 |
dsl | string | ○ | Zanzibar DSL形式の定義 |
リクエスト例
curl -X POST "https://{tenant-domain}/api/admin/rebac/relation-definitions" \ -H "Authorization: Bearer {token}" \ -H "Content-Type: application/json" \ -d '{ "object_type": "folder", "dsl": "definition folder {\n relation owner: [user]\n relation parent: [folder]\n relation viewer: [user, group#member]\n \n permission view = owner | viewer | parent->view\n permission edit = owner | parent->edit\n}" }'レスポンス例
{ "id": "reldef_folder", "object_type": "folder", "relations": [ { "name": "owner", "subject_types": ["user"] }, { "name": "parent", "subject_types": ["folder"] }, { "name": "viewer", "subject_types": ["user", "group#member"] } ], "permissions": [ { "name": "view", "expression": "owner | viewer | parent->view" }, { "name": "edit", "expression": "owner | parent->edit" } ], "created_at": 1706140800}関係定義更新
既存の関係定義を更新します。
エンドポイント
PUT /api/admin/rebac/relation-definitions/:id
リクエスト例
curl -X PUT "https://{tenant-domain}/api/admin/rebac/relation-definitions/reldef_doc" \ -H "Authorization: Bearer {token}" \ -H "Content-Type: application/json" \ -d '{ "dsl": "definition document {\n relation owner: [user]\n relation editor: [user, group#member]\n relation viewer: [user, group#member]\n relation commenter: [user]\n \n permission edit = owner | editor\n permission comment = edit | commenter\n permission view = comment | viewer\n}" }'関係定義削除
関係定義を削除します。
エンドポイント
DELETE /api/admin/rebac/relation-definitions/:id
リクエスト例
curl -X DELETE "https://{tenant-domain}/api/admin/rebac/relation-definitions/reldef_doc" \ -H "Authorization: Bearer {token}"関係タプル一覧取得
関係タプル(オブジェクトとサブジェクト間の実際の関係)の一覧を取得します。
エンドポイント
GET /api/admin/rebac/tuples
クエリパラメータ
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
limit | integer | - | 取得件数(デフォルト: 50) |
cursor | string | - | ページネーションカーソル |
object_type | string | - | オブジェクト種別 |
object_id | string | - | オブジェクトID |
relation | string | - | 関係名 |
subject_type | string | - | サブジェクト種別 |
subject_id | string | - | サブジェクトID |
リクエスト例
curl -X GET "https://{tenant-domain}/api/admin/rebac/tuples?object_type=document&object_id=doc_123" \ -H "Authorization: Bearer {token}"レスポンス例
{ "items": [ { "id": "tuple_abc123", "object_type": "document", "object_id": "doc_123", "relation": "owner", "subject_type": "user", "subject_id": "usr_owner001", "created_at": 1705881600 }, { "id": "tuple_def456", "object_type": "document", "object_id": "doc_123", "relation": "editor", "subject_type": "group", "subject_id": "grp_editors", "subject_relation": "member", "created_at": 1705968000 } ], "total": 5, "cursor": null}関係タプル作成
新しい関係タプルを作成します。
エンドポイント
POST /api/admin/rebac/tuples
リクエストボディ
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
object_type | string | ○ | オブジェクト種別 |
object_id | string | ○ | オブジェクトID |
relation | string | ○ | 関係名 |
subject_type | string | ○ | サブジェクト種別 |
subject_id | string | ○ | サブジェクトID |
subject_relation | string | - | サブジェクト関係(グループメンバーなどの場合) |
リクエスト例
curl -X POST "https://{tenant-domain}/api/admin/rebac/tuples" \ -H "Authorization: Bearer {token}" \ -H "Content-Type: application/json" \ -d '{ "object_type": "document", "object_id": "doc_456", "relation": "viewer", "subject_type": "user", "subject_id": "usr_viewer001" }'レスポンス例
{ "id": "tuple_xyz789", "object_type": "document", "object_id": "doc_456", "relation": "viewer", "subject_type": "user", "subject_id": "usr_viewer001", "created_at": 1706140800}関係タプル削除
関係タプルを削除します。
エンドポイント
DELETE /api/admin/rebac/tuples
リクエストボディ
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
object_type | string | ○ | オブジェクト種別 |
object_id | string | ○ | オブジェクトID |
relation | string | ○ | 関係名 |
subject_type | string | ○ | サブジェクト種別 |
subject_id | string | ○ | サブジェクトID |
リクエスト例
curl -X DELETE "https://{tenant-domain}/api/admin/rebac/tuples" \ -H "Authorization: Bearer {token}" \ -H "Content-Type: application/json" \ -d '{ "object_type": "document", "object_id": "doc_456", "relation": "viewer", "subject_type": "user", "subject_id": "usr_viewer001" }'権限チェック
ユーザーが特定のオブジェクトに対して権限を持っているかチェックします。
エンドポイント
POST /api/admin/rebac/check
リクエストボディ
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
object_type | string | ○ | オブジェクト種別 |
object_id | string | ○ | オブジェクトID |
permission | string | ○ | 権限名 |
subject_type | string | ○ | サブジェクト種別 |
subject_id | string | ○ | サブジェクトID |
リクエスト例
curl -X POST "https://{tenant-domain}/api/admin/rebac/check" \ -H "Authorization: Bearer {token}" \ -H "Content-Type: application/json" \ -d '{ "object_type": "document", "object_id": "doc_123", "permission": "edit", "subject_type": "user", "subject_id": "usr_abc123" }'レスポンス例
{ "allowed": true, "resolution_path": [ { "relation": "editor", "subject": "group:grp_editors#member" }, { "relation": "member", "subject": "user:usr_abc123" } ]}関係展開
特定のオブジェクトと権限に対して、権限を持つすべてのサブジェクトを展開します。
エンドポイント
POST /api/admin/rebac/expand
リクエストボディ
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
object_type | string | ○ | オブジェクト種別 |
object_id | string | ○ | オブジェクトID |
permission | string | ○ | 権限名 |
max_depth | integer | - | 展開の最大深度(デフォルト: 10) |
リクエスト例
curl -X POST "https://{tenant-domain}/api/admin/rebac/expand" \ -H "Authorization: Bearer {token}" \ -H "Content-Type: application/json" \ -d '{ "object_type": "document", "object_id": "doc_123", "permission": "view" }'レスポンス例
{ "object_type": "document", "object_id": "doc_123", "permission": "view", "subjects": [ { "type": "user", "id": "usr_owner001", "via": ["owner", "edit", "view"] }, { "type": "user", "id": "usr_editor001", "via": ["editor", "edit", "view"] }, { "type": "user", "id": "usr_viewer001", "via": ["viewer", "view"] }, { "type": "user", "id": "usr_abc123", "via": ["group:grp_editors#member", "editor", "edit", "view"] } ]}