我知道有一些功能允许用户在策略中仅更新 DynamoDb 中记录的某些字段,但是有没有办法限制对包含地图的字段中的字段的访问?例如,我有一个类似于以下内容的表:
用户 ID [字符串] |名称 [字符串] |属性 [地图] |
在"属性"映射中,我想限制用户只能更新映射的某个列,比如说"值"(如果它是仅包含"哈希"和"值"自命名列的映射)。如果它是权限链接,则类似于以下内容:
arn:.../tables/testTable/Attributes/Value
这可能吗?
据我所知,文档显示,不,您不能针对映射中的特定键。因此,要么将它们拆分为自己的"字段",要么允许用户修改整个地图。
值得注意的是,在 DynamoDB 行话中,表是项目的集合。项是属性的集合。因此,将属性命名为"属性">可能会导致混淆。
随便...我会推荐类似于以下内容的模型,其中特征;)是单独的项目属性:
UserID [string]
Name [string]
Height [string]
Weight [Float]
Race [String]
(我猜的是用户的特征)
这是一个策略,允许他们仅更新身高和体重,并且只能根据UserID更新自己的记录。当然,这方面的"用户"需要以某种方式联合起来。出于我们在这里的目的,我假设您可能使用 Web 联合身份验证。
{
"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
是正确的。它是替换变量的一部分
从文档中:
- dynamodb:LeadingKeys – 此条件键允许用户仅访问分区键值与其用户 ID 匹配的项目。此 ID ${www.amazon.com:user_id} 是一个替换变量。有关替换变量的更多信息,请参阅使用 Web 联合身份验证。
- dynamodb:属性 – 此条件键限制对指定属性的访问,以便只有权限策略中列出的操作才能返回这些属性的值。此外,StringEqualsIfExists 子句可确保应用必须始终提供要操作的特定属性的列表,并且应用无法请求所有属性。