Доступ только для владельца контента в хранилище firebase android Java - PullRequest
0 голосов
/ 08 мая 2020

Привет, уважаемые программисты! Я делаю проект приложения для записи голоса (с функционированием облачного хранилища), и в этом приложении звук сохраняется в хранилище телефона в папке «Zrecorder» (имя моего приложения), и внутри этого создается папка с именем адрес электронной почты userName (пример - vijay@gmail.com), а затем аудио находится внутри папки в формате mp3. Когда пользователь создает резервную копию данных, папка загружается в хранилище firebase, только если пользователь уже вошел в систему. Теперь в хранилище firebase есть папка, созданная так же, как мы создали в хранилище телефона таким же образом. Поэтому, когда пользователь восстанавливает данные, сначала мы получаем его userName, а затем находим папку userName в хранилище firebase, затем мы загружаем папку в хранилище телефона (папки не могут быть загружены, поэтому я использовал циклы, чтобы получить ссылки на каждый файл и загрузить их в специальная папка c по классу диспетчера загрузок). Надеюсь, вы понимаете, о чем я говорю.

Итак, вот моя проблема: я хочу, чтобы каждый пользователь имел доступ только к своей собственной папке. Я видел это в документации по firebase, но я не понимал код должным образом. Говорят, делайте это, используя uid, но я этого не понимаю.

Вот как пользователь входит в мое приложение.

public void loginUser(String email, String password) {


        auth.signInWithEmailAndPassword(email, password)
.addOnSuccessListener(new OnSuccessListener<AuthResult>() {
            @Override
            public void onSuccess(AuthResult authResult) {

                // For Saving the LoginState if previously logged in then no need again
                SharedPreferences sharedPreferences = getSharedPreferences("LogSharedPref",MODE_PRIVATE);
                SharedPreferences.Editor editor = sharedPreferences.edit();
                editor.putBoolean("LoggedInStatus",true);
                editor.putString("UserEmail",textEmail.toLowerCase());
                editor.apply();



                Toast.makeText(LoginActivity.this, "Login Successful", Toast.LENGTH_SHORT).show();
                startActivity(new Intent(LoginActivity.this, PermissionActivity.class));
                finish();
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Toast.makeText(LoginActivity.this, "Invalid Details", Toast.LENGTH_SHORT).show();
                login.setEnabled(true);
            }
        });
    }

Вы можете видеть, что я сохраняю userName в общих настройках так что каждый раз, когда пользователь восстанавливает данные, мы получаем userName из sharedPref.

Вот как я загружаю данные в Firebase.

/* Here we pass the userName into this method 
and we get the files downloaded in the phone storage into the same UserName folder.*/

void getLinksText(String userName) {


        storageReferenceDown = FirebaseStorage.getInstance().getReference();
        StorageReference downloadRef = storageReferenceDown.child(userName);

// Here i am getting the list of items inside userName folder in firebase storage

        downloadRef.listAll()
                .addOnSuccessListener(new OnSuccessListener<ListResult>() {
                    @Override
                    public void onSuccess(ListResult listResult) {

                        for (final StorageReference item : listResult.getItems()) {

                            item.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                                @RequiresApi(api = Build.VERSION_CODES.KITKAT)
                                @Override
                                public void onSuccess(Uri uri) {
                                    String downloadUrl = uri.toString();
                                    String name = item.getName();
                                    startDownloading(downloadUrl, userName);

                                }
                            });

                        }

                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        // Uh-oh, an error occurred!
                    }
                });

    }

Итак, вы можете сказать мне, как я могу дать пользователю доступ только к его собственной папке, которая является userName (например, vijay@gmail.com). Я получил это из документации Google Firebase.

Content-owner only access
These rules restrict access to the authenticated owner of the content only. The data is only readable and writable by one user, and the data path contains the user's ID.

When this rule works: This rule works well if data is siloed by user — if the only user that needs to access the data is the same user that created the data.

When this rule doesn't work: This ruleset doesn't work when multiple users need to write or read the same data — users will overwrite data or be unable to access data they've created.

To set up this rule: Create a rule that confirms the user requesting access to read or write data is the user that owns that data.

// Grants a user access to a node matching their user ID
service firebase.storage {
  match /b/{bucket}/o {
    // Files look like: "user/<UID>/path/to/file.txt"
    match /user/{userId}/{allPaths=**} {
      allow read, write: if request.auth.uid == userId;
    }
  }
}

Мои текущие правила настроены в хранилище firebase

rules_version = '2';
service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if request.auth != null;
    }
  }
}

Можете ли вы помочь мне получить код java, потому что я не знаю, как получить uid, а затем настроить его в указанной папке c для определенного c пользователя.

Пожалуйста, помогите мне Я уже искал youtube, stackoverflow, stackExchange, google docs, quora, но не нашел конкретного c ответа на свой вопрос. Я работаю над проектом, помогите, пожалуйста, мне это действительно нужно!

Еще одна вещь - я использую хранилище firebase, а не облачное хранилище.

1 Ответ

0 голосов
/ 08 мая 2020

Похоже, вы ищете это:

service firebase.storage {
  match /b/{bucket}/o {
    // Files look like: "Zrecorder/<email>/path/to/file.txt"
    match /Zrecorder/{email}/{allPaths=**} {
      allow read, write: if request.auth.token.email == email;
    }
  }
}

См. Также:

...