Tags
FirestoreSecurityData Model PatternData Modelアクセス制御
Last Updated
Sep 6, 2024 2:18 AM
Created
Sep 2, 2024 6:55 AM
Role-Based Authorization Pattern (RBAC)は、サービス内のコンテンツにグローバルにアクセス制御を行う際に用いられる(ex. NetflixのSubscription) データモデルのパターンです。
本記事では、FirestoreでRBACを実装する際に、基本となるデータモデルについて解説していきます。
INFO
RBACと対比的に語られるデータモデルのパターンとしてABACが存在します。 グローバルにアクセス制御を行うRBACに対して、ABACは、 個別コンテンツへのアクセス制御 (ex. NetfrixのSubscription)に用いられます。 詳しくは、以下、ABACの解説記事もご参照ください
RBACとは?
Data Model
- roles Collectionを作成し、roleの名称をdocumentIdとしたroleを作成
- users Collectionを作成し、にroleのDocumentIdをString型のArrayで格納
# roles
- documentId: 'admin'
- documentId: 'editor'
- …
# users
- documentId: 'ヒソカ=モロウ'
- roles :Array
- String: 'admin' ※
- String: 'editor'
- …
- …
※Document Reference型としてもよいがIndexが効かなくなるため、String型としています
Security Rule
- request.auth.uid (ログイン中のuser)と一致するusersのrolesの有無を参照して、アクセス制御を行う
// rules.json
match /posts/{id} {
function getRoles() {
return get(/databases/$(database)/documents/users/$(request.auth.uid)).data.roles;
}
allow create: if getRoles().hasAny(['admin']) == true;
allow read: if request.auth != null;
allow update: if getRoles().hasAny(['admin', 'editor']) == true;
allow delete: if getRoles().hasAny(['admin']) == true;
}
Triggers of Update Duplicated Data
- 以下、Triggerとなる事象の発生に基づきCloud Functionを起動、冗長化されたデータのUpdateの処理を行う
# | Trigger | Frequency | Update |
1 | rolesからdocumentをDelete | very low | users内のすべてのドキュメントのrolesから削除対象となるroleを削除 |