Tags
FirestoreData Model PatternData ModelFirebaseSecurityアクセス制御
Last Updated
Sep 6, 2024 1:53 AM
Created
Sep 2, 2024 9:19 AM
Attribute-Based Access Control Pattern (ABAC)は、サービス内の個別コンテンツへのアクセス制御 (ex. Kindleで購入済電子書籍へのアクセス) に用いられるデータモデルのパターンです。
本記事では、NoSQL DatabaseであるFirestoreにおける実装方法、およびABACの応用的なデータモデルについて解説していきます。
INFO
一方で、グローバルなコンテンツへのアクセス制御(ex. Kindleで購入済電子書籍へのアクセス) には、RBACが用いられるケースが多いです。 (以下、RBACの解説記事もご参照ください)
ABACとは?
Data Model
- posts(ABACを適用するCollection) にString型のArray型でuserのDocumentIdを書き込む
# users
- documentId: 'クロロ=ルシルフル'
- documentId: 'ノブナガ=ハザマ'
- documentId: 'フェイタン=ポートオ'
- …
# posts ABACを適用するCollection
- documentId: '幻影旅団のひみつ'
- owners :Array
- 'クロロ=ルシルフル' :String ※
- …
- editors :Array
- 'クロロ=ルシルフル' :String
- 'ノブナガ=ハザマ' :String
- 'フェイタン=ポートオ' :String
- …
※Document Reference型としてもよいがIndexが効かなくなるため、String型としている
Security Rule
- request.auth.uid (ログイン中のuser)と一致するpostsのownewsなどの有無を参照して、アクセス制御を行う
// rules.json
match /posts/{id} {
allow read: if request.auth != null;
allow write: if resource.data.owners.hasAny(request.auth.uid) ||
resource.data.editors.hasAny(request.auth.uid);
}
Triggers of Update Duplicated Data
- 以下、Triggerとなる事象の発生に基づきCloud Functionを起動、冗長化されたデータのUpdateの処理を行う
# | Trigger | Frequency | Update |
1 | usersからdocumentをDelete | low | posts内のすべてのドキュメントのownersなどから同userを削除 |