【发布时间】:2020-05-03 04:39:50
【问题描述】:
我有一个放大反应应用程序,它允许用户上传私人文件并查看它们。我想实现一个功能,上传者可以动态指定还有谁(哪些用户)也可以查看和修改这些文件。但是,这些文件将只对上传者和与用户共享的人保持私有,其他人不会。
我的应用设置为:
- 存储:S3
- 身份验证:认知
- 数据库:DynamoDB
- api:graphQL
应用程序将私有文件存储在 S3 存储桶上:
import { Storage } from 'aws-amplify';
const response = await Storage.put(file.name, file, { level: 'private', progress(progress) {...} });
response.key 返回的文件路径使用基于此模式的 graphQL api 存储在数据库中:
type File @model @auth(rules: [{ allow: owner }]) {
id: ID!
s3Key: String
}
在向上传者展示数据和文件时,我会查询此架构以仅显示与特定用户相关的文件并使用以下方法获取它们:
url = await Storage.get(response.key, {level: 'private'})
这是因为该用户的 Cognito 身份在 S3 策略(某处?)中用于建立访问权限。
现在,我想实现一些用户之间的文件共享。通过对架构的这种修改,在数据库级别上很容易做到这一点:
type File @model @auth(rules: [{ allow: owner }, { allow: owner, ownerField: "owners" }]) {
id: ID!
s3Key: String
owners: [String]
}
所以现在上传者可以通过简单地将用户名添加到 owners 字段中的数组来指定能够从数据库中获取此数据的用户。
但是,我不确定如何使存储在 S3 存储桶中的文件可供其他所有者使用。
我不能使用所有者的密钥,因为存储的文件仅对上传者可用(他们应该这样做),而且我不确定代码如何指定可以访问/修改特定文件的不同 Cognito 身份。我需要找到一种方法来授予访问权限。
澄清一下:文件的上传者列出了哪些人(认知身份/用户名)可以访问该文件。他们可以随时添加和删除有权访问文件的帐户(因此这基本上是对数据库中owners 字段的修改)。
谢谢!
【问题讨论】:
标签: reactjs amazon-web-services amazon-s3 graphql aws-amplify