私のアプリケーションには、チャットルームや特定のプロジェクトなど、さまざまなユーザーグループがあります。
これらのグループのユーザーがプレゼンスデータを共有し、グループ内の他のすべてのユーザーのプレゼンスを確認できるようにしながら、そのデータを外部から非公開にするにはどうすればよいですか?
私のアプリケーションには、チャットルームや特定のプロジェクトなど、さまざまなユーザーグループがあります。
これらのグループのユーザーがプレゼンスデータを共有し、グループ内の他のすべてのユーザーのプレゼンスを確認できるようにしながら、そのデータを外部から非公開にするにはどうすればよいですか?
まず、サポートされているFirebase認証メカニズムの1つを使用して、ユーザーの認証を開始する必要があります。Firebaseでの認証の詳細については、https: //www.firebase.com/docs/security/authentication.htmlをご覧ください。
ユーザーの認証を開始すると、ユーザーの安全で検証済みのユーザーデータが、auth
変数を介してセキュリティルールで利用できるようになります。認証されたユーザーがいて、各ユーザーがを介してアクセスできる一意のIDを持っていると仮定しますauth.uid
。
グループプレゼンスを共有するには、次のような構造を使用してデータを保存することをお勧めします。
/groups/<group-id>/users/<user-id>/<presence-status>
この構造を使用すると、プレゼンスデータをグローバルにプライベートにするセキュリティルールを記述できますが、ユーザーは、許可されているグループ内の各ユーザーのプレゼンス状態のみを表示し、自分のユーザーの状態のみを編集できます。これらの制限を適用するセキュリティルールセットの例を次に示します。
{
"groups": {
"$groupid": {
// Users can view the presence state of users in this group if they
// are authenticated and listed in the group themselves.
".read": "auth != null && data.child('users').hasChild(auth.uid)"
"users": {
"$userid": {
// Users can update only their individual account data.
".write": "auth != null && $userid == auth.uid && newData.val() != null"
}
}
}
}
}
上記の例では、のユーザーのみ/groups/<group-id>/users/
がグループのプレゼンスデータを表示する権限を持っており、各ユーザーは個々のデータのみを変更できます。ユーザーは、個々のユーザーノードに対してのみ読み取り/書き込みを行うことができます。
これをもう少し拡張するために、グループの作成を許可されている唯一のユーザーの特別なクラスがあるとします。認証トークンを生成するときにユーザーのアクセス許可レベルを含め(以下の例では、を設定しますisAdmin=true
)、更新されたセキュリティルールを使用してその特別なレベルのアクセスを許可できます。たとえば、特定のユーザーのみがグループの作成を許可されている場合、$groupidの下の.writeルールを次のように更新できます。
"$groupid": {
// Only admins can create new groups.
".write": "auth != null && auth.isAdmin === true"
//...
}