我有一个Cognito用户池,其中包含分配给组的用户。
每个组都有自己的角色,在登录时分配(通过联合身份验证用户)。这部分很有效。
因此,可以创建不同的访问级别和组以匹配这些情况。我正在使用DynamoDB来存储一些用户和组织相关的数据。每个角色都可以进行微调。
如果出现问题,需要有多个租户。我添加了一个自定义属性,并根据上面讨论的角色限制了对编辑和更新此属性的访问权限。对于DynamoDB,在IAM策略中,我能够根据硬编码的组织ID(可以附加到每个项目)来限制对行的访问。
就像这样“rd”是组织ID的硬编码值:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"dynamodb:GetItem",
"dynamodb:BatchGetItem",
"dynamodb:PutItem",
"dynamodb:UpdateItem",
"dynamodb:DeleteItem"
],
"Resource": [
"arn:aws:dynamodb:{region}:{number}:table/*"
],
"Condition": {
"ForAnyValue:StringEquals": {
"dynamodb:LeadingKeys": [
"rd"
]
}
}
}
]
}
但是,我希望能够访问与登录用户相关的属性(不是他们的唯一ID,而是他们可以与其组织中的其他人共同使用的内容)以避免硬编码。像这样:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"dynamodb:GetItem",
"dynamodb:BatchGetItem",
"dynamodb:PutItem",
"dynamodb:UpdateItem",
"dynamodb:DeleteItem"
],
"Resource": [
"arn:aws:dynamodb:{regions}:{number}:table/*"
],
"Condition": {
"ForAnyValue:StringEquals": {
"dynamodb:LeadingKeys": [
"${cognito-idp.{region}.amazonaws.com/{poolID}:attr[custom:org_id]}"
]
}
}
}
]
}
我得到的错误是:
AccessDeniedException: User: arn:aws:sts::{number}:assumed-role/{role_name}/CognitoIdentityCredentials is not authorized to perform: dynamodb:GetItem on resource: arn:aws:dynamodb:{region}:{number}:table/{table_name}
我测试了不同的配置,到目前为止通过反复试验,硬编码方法已经奏效,但所有类型的变量都失败了。如果有更好的方式实现多租户,请随时提出建议。但是,如果我可以直接从我的用户池访问变量,那就太棒了。
有谁知道如何实现这一目标(我已经完成了很多文档并尝试了很多组合)?
另外:“dynamodb:Query”似乎不想接受“dynamodb:LeadingKeys”,但文档似乎另有说法,所以我已经从这个例子中删除了它。
我正在使用aws-sdk + cognito-identity-js进行身份验证和发出请求,这正在正常工作并在我放松权限时返回数据。