ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

android – Firebase规则:动态授予特定用户访问权限

2019-07-11 07:25:15  阅读:230  来源: 互联网

标签:android firebase firebase-storage firebase-security


我正在构建一个Android应用程序,它要求我为用户存储一些图片.

假设我有2个用户:A和B.他们应该能够读取/写入他们的特定文件夹:用户A可以读取和写入桶/ images / userA,用户B可以读取和写入桶/ images / userB.他们不应该有任何其他权限.

现在让我们说用户A上传了picture1.jpg和picture2.jpg.用户A如何向用户B授予对bucket / images / userA / picture1.jpg的访问权限?用户B不应该访问picture2.jpg.

我正在寻找可以为许多用户扩展的解决方案(~100.00).我想每次我想要访问文件时,都要在存储规则中添加规则并不是一个好主意.

我现在使用的解决方案是任何登录的人都可以阅读任何内容,如果他们有完整的路径.路径不容易猜到,当我想提供访问时,我提供了链接.这是一个安全的解决方案吗?我不这么认为.

解决方法:

在客户端

你可以use custom File Metadata.它的作用是添加一个Map< String,String>到文件的元数据.由于Map中的键是唯一的,因此您可以将用户B的id存储为键,并使用空字符串作为值:

StorageMetadata metadata = new StorageMetadata.Builder()
                        .setCustomMetadata(userId,"") //User B's id
                        .build();

然后使用updateMetadata()方法共享文件:

picture1Ref.updateMetadata(metadata)
        .addOnSuccessListener(new OnSuccessListener<StorageMetadata>() {
            @Override
            public void onSuccess(StorageMetadata storageMetadata) {
                // Updated metadata is in storageMetadata
            }
        })
        .addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception exception) {
                // Uh-oh, an error occurred!
            }
        });

在Firebase控制台上

然后,为了在Firebase端进行验证,您可以将规则设置如下:

service firebase.storage {
  match /b/{bucket}/o {
    match /images/{userId}/{pictureName}{
      allow write: if request.auth.uid == userId;
      allow read: if request.auth.uid == userId || request.auth.uid in resource.metadata.keys();
    }
  }
}

与更多用户分享

如果您想与更多用户共享同一个文件(假设用户C和D),您可以重复将其ID传递给自定义元数据的相同步骤,因为只更新元数据中指定的属性而所有其他属性保持不变.

撤消用户访问权限

如果要撤消特定用户的访问权限,可以将空值设置为自定义元数据,然后再次调用updateMetadata().

StorageMetadata metadata = new StorageMetadata.Builder()
                        .setCustomMetadata(userId, null)
                        .build();

标签:android,firebase,firebase-storage,firebase-security
来源: https://codeday.me/bug/20190711/1429785.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有