我的设置: - 移动中心 - Cognito 用户池 - API网关 - DynamoDB
到目前为止我所做的工作: 用户可以注册/登录 Cognito 用户池并获取 Id 和 AccessToken。 IdToken 与 Api 网关 Cognito 授权方一起使用来访问 Api 网关。 将用户子映射到 DynamoDb 的集成消息中是有效的。
"userId": {
"S": "$context.authorizer.claims.sub"
}
限制对 DynamoDb 表中非用户行的访问不起作用。 DynamoDb 表是使用 Mobile Hubs protected 表功能创建的,该功能创建以下策略:
"Condition": {
"ForAllValues:StringEquals": {
"dynamodb:LeadingKeys": [
"${cognito-identity.amazonaws.com:sub}"
]
}
}
但这不起作用,因为此表达式返回身份用户 ID,而不是用户池子。首先我没有使用身份池,其次我想在此处使用用户子。
我发现了
${cognito-idp.<REGION>.amazonaws.com/<POOL-ID>:sub}
应该可以解决问题,但这也不起作用。
如果我对条件进行硬编码以使用测试用户的 Sub,一切都会按预期工作,因此策略本身没问题,只是获取当前用户的 sub 的表达式无法正常工作。
是否可以调试 IAM 策略以查看运行时表达式的值?
有什么想法、提示、建议吗?
提前致谢。
最佳答案
我终于通过使用 aws:PrincipalTags 弄清楚了这一点
先决条件是确保 Cognito 用户承担的 IAM 角色具有 sts:TagSession
承担角色策略权限。 This allows principal tags to be passed after successful login to Cognito.
在 Cognito 身份池中,打开身份验证提供程序并找到 Cognito 提供程序。确保访问控制的属性使用将 username
映射到 sub
的默认映射,或者您有一个传递 sub
属性的自定义规则集到一个PrincipalTag。
最后,您可以使用角色过滤器中传递的标签来仅允许该子角色访问资源。
{
"Action": [
"dynamodb:UpdateItem",
"dynamodb:Query",
"dynamodb:PutItem",
"dynamodb:GetItem"
],
"Condition": {
"ForAllValues:StringEquals": {
"dynamodb:LeadingKeys": "${aws:PrincipalTag/username}"
}
},
"Effect": "Allow",
"Resource": "arn:aws:dynamodb:*:*:table/MyTableName",
"Sid": ""
}
关于amazon-web-services - DynamoDBleadingKeys 限制的 IAM 策略 Cognito 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56801845/