コンテンツにスキップ

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

クエリパラメータ

パラメータ必須説明
limitinteger-取得件数(デフォルト: 50)
cursorstring-ページネーションカーソル
object_typestring-オブジェクト種別でフィルタ

リクエスト例

Terminal window
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_typestringオブジェクト種別
dslstringZanzibar DSL形式の定義

リクエスト例

Terminal window
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

リクエスト例

Terminal window
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

リクエスト例

Terminal window
curl -X DELETE "https://{tenant-domain}/api/admin/rebac/relation-definitions/reldef_doc" \
-H "Authorization: Bearer {token}"

関係タプル一覧取得

関係タプル(オブジェクトとサブジェクト間の実際の関係)の一覧を取得します。

エンドポイント

GET /api/admin/rebac/tuples

クエリパラメータ

パラメータ必須説明
limitinteger-取得件数(デフォルト: 50)
cursorstring-ページネーションカーソル
object_typestring-オブジェクト種別
object_idstring-オブジェクトID
relationstring-関係名
subject_typestring-サブジェクト種別
subject_idstring-サブジェクトID

リクエスト例

Terminal window
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_typestringオブジェクト種別
object_idstringオブジェクトID
relationstring関係名
subject_typestringサブジェクト種別
subject_idstringサブジェクトID
subject_relationstring-サブジェクト関係(グループメンバーなどの場合)

リクエスト例

Terminal window
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_typestringオブジェクト種別
object_idstringオブジェクトID
relationstring関係名
subject_typestringサブジェクト種別
subject_idstringサブジェクトID

リクエスト例

Terminal window
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_typestringオブジェクト種別
object_idstringオブジェクトID
permissionstring権限名
subject_typestringサブジェクト種別
subject_idstringサブジェクトID

リクエスト例

Terminal window
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_typestringオブジェクト種別
object_idstringオブジェクトID
permissionstring権限名
max_depthinteger-展開の最大深度(デフォルト: 10)

リクエスト例

Terminal window
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"]
}
]
}