Ролевая аутентификация в зависимости от группы в правилах брандмауэра Google Cloud - PullRequest
0 голосов
/ 31 октября 2018

Я пытаюсь защитить приложение, в котором пользователи могут управлять своими группами. Пользователи могут быть частью нескольких полос и, следовательно, могут иметь разные роли в зависимости от того, какую полосу они редактируют в настоящее время. Роль хранится на карте в документе Band.

Есть ли способ применить это к правилам пожарных? Так что функция getRole () будет работать не только для «бэндов», но и для других коллекций, содержащих поле idBand (например, «события»)

Моя настройка выглядит следующим образом: Firestore Setup

Я пытался сделать что-то вроде этого:

function getRole(){
    return get(/databases/{database}/documents/bands/request.resource.data.idBand/members/$(request.auth.uid)).data.role
}

match /bands/{document=**}  {
    allow read;
  allow write: if getRole() == 'OWNER';
}  

1 Ответ

0 голосов
/ 01 ноября 2018

Попробуйте что-то вроде этого:

// Rules for a band document and its subcollections
match /bands/{bandID}{

  function isBandOwner(userID){ 
    // Determine if user is a band owner
    return get(/databases/$(database)/documents/bands/$(bandID)).data.members[userID].role == 'OWNER';
  }

  // Anyone can read
  allow read;

  // Only authenticated owners can write to band doc
  allow write: if request.auth != null && isBandOwner(request.auth.uid);

   // Rules for all of a band's subcollections
     match /{document=**}{

     // Anyone can read
     allow read;

     // Only authenticated owners can write to a band's subcollections
     allow write: if request.auth != null && isBandOwner(request.auth.uid);

   }        
}

Чтобы попробовать, давайте также ограничим чтение и попробуем прочитать некоторые тестовые документы:

allow read: if isBandOwner(request.auth.uid);

Установите Firebase Auth с Google Sign-in и попробуйте прочитать из Cloud Firestore:

<script src="https://www.gstatic.com/firebasejs/5.5.9/firebase.js"></script>
<script>
  // Initialize Firebase
  // TODO: Replace with your project's customized code snippet
  var config = {
    apiKey: "<API_KEY>",
    authDomain: "<PROJECT_ID>.firebaseapp.com",
    databaseURL: "https://<DATABASE_NAME>.firebaseio.com",
    projectId: "<PROJECT_ID>",
    storageBucket: "<BUCKET>.appspot.com",
    messagingSenderId: "<SENDER_ID>",
  };
  firebase.initializeApp(config);

  //Sign in with Google
  var provider = new firebase.auth.GoogleAuthProvider();

  firebase.auth().signInWithPopup(provider).then(function(result) {
  // This gives you a Google Access Token. You can use it to access the Google API.
  var token = result.credential.accessToken;
  // The signed-in user info.
  var user = result.user;
  console.log(`UserId: ${user.uid}`)

  // Try reading Firestore docs
  var db = firebase.firestore();

    // Disable deprecated features
    db.settings({
      timestampsInSnapshots: true
    });

    // This doc has members.[my-uid].role = "OWNER"
    // Read should succeed
    db.doc("bands/abc").get().then((doc) => {
            console.log(`${doc.id} => ${doc.data().name}`);
    });

    // This doc has members.[my-uid].role = "BANDMEMBER"
    // Read should fail
    db.doc("bands/def").get().then((doc) => {
            console.log(`${doc.id} => ${doc.data().name}`);
    });
  // ...
}).catch(function(error) {
  // Handle Errors here.
  var errorCode = error.code;
  var errorMessage = error.message;
  // The email of the user's account used.
  var email = error.email;
  // The firebase.auth.AuthCredential type that was used.
  var credential = error.credential;
  // ...
  console.log('error login');
});
</script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...