我在 Cognito 用户池中有用户,其中一些在 Administrators
组中。需要允许这些管理员读取/写入特定的 S3 存储桶,而其他用户则不能。
为了实现这一点,我为 Administrators
组分配了一个角色,如下所示:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::my-bucket-name/*"
]
}
]
}
然后在我的 Angular 应用程序中,我登录并使用 Amplify 的 Storage
类执行以下操作:
Storage.put("test.txt", "hello")
.then(result => ...)
.catch(err => ...);
本例中的 Amplify.configure
是:
const amplifyConfig = {
Auth: {
region: "eu-west-2",
userPoolId: xxx,
userPoolWebClientId: yyy,
mandatorySignIn: false,
},
Storage: {
AWSS3: {
bucket: 'my-bucket-name',
region: "eu-west-2"
}
}
};
Amplify.configure(amplifyConfig);
这里的问题是,在内部,没有向 Storage.put
调用提供凭据,任务失败如下:
[DEBUG] 31:08.487 Credentials - Failed to load credentials
ZoneAwarePromise {__zone_symbol__state: false, __zone_symbol__value: NotAuthorizedException:
Unauthenticated access is not supported for this identity pool.
仔细阅读,这似乎是因为除非您拥有联合身份池,否则您根本就无法获得凭据。因此,我创建了一个附加到我的用户池 + 应用程序客户端的身份池,使用所有默认值,并将其 ID 添加到我的 Amplify.configure
配置中。
这仍然不起作用,但这次我确实获得了凭据 - 它们用于身份池的已验证角色中指定的 IAM 角色。
所以现在如果我将上述 S3 权限添加到该角色,我的所有代码都可以工作,但是现在存在一个巨大的安全漏洞所有用户(不仅仅是管理员)都可以读/写管理员的桶。啊。
那么,当且仅当我是管理员时,我如何才能获得管理员用户组设置中指定角色的凭据?
或者,这是否可以通过联合身份中的一些巧妙设置来解决,即根据用户组分配正确的角色?
答案 0 :(得分:0)
解决方案在于联合身份池的设置。
默认情况下,身份池将提供其配置的 IAM 角色。换句话说,它设置的“未经身份验证的角色”或“经过身份验证的角色”之一。
但是可以告诉它提供身份验证提供者指定的角色。这就是解决这里问题的方法。
这将允许 Cognito 指定自己的角色,您会发现用户获得了他们所在组的权限。