【问题标题】:DynamoDB Fine Grained Access to Map ItemsDynamoDB 对地图项的细粒度访问
【发布时间】:2017-03-23 02:10:58
【问题描述】:

我知道有允许用户在策略中仅更新 DynamoDb 中记录的某些字段的功能,但是有没有办法限制对包含地图的字段中的字段的访问?例如,我有一个类似于以下的表:

用户ID [字符串] |名称 [字符串] |属性 [地图] |

在“属性”映射中,我想限制用户只能更新映射的某个列,比如说“值”(如果它是只有“哈希”和“值”自我的映射-命名的列)。如果它是权限链接,则类似于以下内容:

arn:.../tables/TestTable/Attributes/Value

这可能吗?

【问题讨论】:

    标签: amazon-web-services dictionary amazon-dynamodb access-control amazon-iam


    【解决方案1】:

    根据我对文档的了解,不,您不能针对地图中的特定键。因此,要么将它们拆分为自己的“字段”,要么允许用户修改整个地图。

    值得注意的是,在 DynamoDB 行话中,TablesItems 的集合。项目是属性的集合。因此,将属性命名为“属性”可能会导致混淆。

    Anywho... 我会推荐一个类似于以下的模型,其中特性 ;) 是单独的项目属性:

    UserID [string]
    Name [string]
    Height [string]
    Weight [Float]
    Race [String]
    

    (我在猜测用户的特征)

    这是一项政策,允许他们仅更新身高和体重,并且仅根据用户 ID 更新他们自己的记录。当然,在这方面的“用户”需要以某种方式成为federated。出于我们的目的,我假设您可能会使用Web Identity Federation

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "AllowAccessToOnlyItemsMatchingUserID",
                "Effect": "Allow",
                "Action": [
                    "dynamodb:GetItem",
                    "dynamodb:BatchGetItem",
                    "dynamodb:Query",
                    "dynamodb:PutItem",
                    "dynamodb:UpdateItem",
                    "dynamodb:DeleteItem",
                    "dynamodb:BatchWriteItem"
                ],
                "Resource": [
                    "arn:aws:dynamodb:us-west-2:123456789012:table/Users"
                ],
                "Condition": {
                    "ForAllValues:StringEquals": {
                        "dynamodb:LeadingKeys": [
                            "${www.amazon.com:user_id}"
                        ],
                        "dynamodb:Attributes": [
                            "UserID",
                            "Height",
                            "Weight",
                            ...
                            <list other allowed to edit attributes here>
                        ]
                    },
                    "StringEqualsIfExists": {
                        "dynamodb:Select": "SPECIFIC_ATTRIBUTES"
                    }
                }
            }
        ]
    }
    

    是的,${www.amazon.com:user_id} 中的 user_id 是正确的。它是替换变量

    的一部分

    From the documentation

    • dynamodb:LeadingKeys – 此条件键允许用户仅访问分区键值与其用户 ID 匹配的项目。此 ID ${www.amazon.com:user_id} 是一个替换变量。有关替换变量的更多信息,请参阅使用 Web 身份联合。
    • dynamodb:Attributes – 此条件键限制对指定属性的访问,因此只有权限策略中列出的操作才能返回这些属性的值。此外,StringEqualsIfExists 子句确保应用程序必须始终提供要执行的特定属性列表,并且应用程序不能请求所有属性。

    【讨论】:

    • "Attributes" 只是一个填充名称。我正在开发一个应用程序,所以我不想放弃太多或放弃数据库结构。谢谢您的帮助!我必须变得更有创意,看起来像