web-dev-qa-db-ja.com

firebaseにロールベースのアクセス制御を実装するにはどうすればよいですか

これはFirebaseとnosqlへの私の最初の進出であり、SQLのバックグラウンドから来ました。

簡易ログインセキュリティメール/パスワードを使用して、Firebaseのデータへのアクセスを制限するにはどうすればよいですか?たとえば、一部のユーザーはビジネスオブジェクト(ユーザー、顧客、カテゴリなど)を作成するためのアクセス権を持っていますが、他のユーザーは持っていません。 「auth」変数に権限のリストを添付する方法はありますか?

34
acole76

許可を直接auth変数にアタッチする方法はありません(少なくとも、意図した戦略ではないようです)。 auth.uidで編成されたユーザーのコレクションを作成することをお勧めします。セキュリティルールが次のようになるように(未テスト)、あらゆる種類のアクセス許可属性を保持できます。

{
  "rules": {
    ".read": true,
    "users": {
      ".write": "root.child('users').child(auth.uid).child('role').val() == 'admin'"
    }
  }
}

roleは、usersコレクション内のすべてのオブジェクトに属する属性です。

[〜#〜] update [〜#〜]

以下のコメントを参照してください。

「権限を認証変数に直接関連付ける方法はありません」これは2017年に変更されました。セキュリティルールで利用できるカスタムプロファイルを認証プロファイルに添付できるようになりました。カスタムクレームについては、bojeilの回答とFirebaseのドキュメントを参照してください。 –フランクヴァンパフェレン

33
hiattp

Firebaseは、IDトークンのカスタムユーザークレームを介したユーザーのロールベースのアクセスのサポートを開始しました。 https://firebase.google.com/docs/auth/admin/custom-claims

管理者アクセスルールを定義します。

_{
  "rules": {
    "adminContent": {
      ".read": "auth.token.admin === true",
      ".write": "auth.token.admin === true",
    }
  }
}
_

Firebase Admin SDKでユーザーロールを設定します。

_// Set admin privilege on the user corresponding to uid.
admin.auth().setCustomUserClaims(uid, {admin: true}).then(() => {
  // The new custom claims will propagate to the user's ID token the
  // next time a new one is issued.
});
_

これは、対応するユーザーのIDトークン要求に伝達されます。次の直後にトークンを強制的に更新できます:user.getIdToken(true)

クライアントのトークンから解析するには、IDトークンのペイロードをbase64デコードする必要があります。 https://firebase.google.com/docs/auth/admin/custom-claims#access_custom_claims_on_the_client

必要に応じてユーザーをアップグレード/ダウングレードできます。また、ユーザーのアクセスレベルを変更する定期的なスクリプトがある場合、すべてのユーザーをリストするプログラム的な方法も提供しました。 https://firebase.google.com/docs/auth/admin/manage-users#list_all_users =

9
bojeil

これを1年後にもう一度見ると、「カスタムトークン」の方が適している可能性があります。

https://www.firebase.com/docs/security/guide/user-security.html#section-custom

8
Jamey McElveen