我正在开发一个服务,需要访问DynamoDB表,必须通过授权用户访问该表来管理。账户管理由Cognito处理。目前我正在调查直接访问DynamoDB表的方法,基于用户组关联IAM策略来限制读写权限。
表中存在多个组织,多个用户与一个组织相关联。下面是一个模型示例。我还以一对多的方式存储了部门和行业信息。
用户的Cognito子标识存储为他们的用户ID,在USR#下存储在数据库中。
表中存在多个组织,多个用户与一个组织相关联。下面是一个模型示例。我还以一对多的方式存储了部门和行业信息。
用户的Cognito子标识存储为他们的用户ID,在USR#下存储在数据库中。
+-------+-------+-----------------+------------+--------+
| PK | SK | Name | GSI1PK | GSI2PK |
+-------+-------+-----------------+------------+--------+
| ORG#1 | ORG#1 | Acme Inc | | |
| ORG#1 | USR#1 | John Doe | | |
| ORG#2 | ORG#2 | Globetex | | |
| ORG#2 | USR#2 | Jane Doe | | |
| ORG#1 | SEC#1 | Sector A1 | ORG#1SEC#1 | SEC#1 |
| DEP#1 | DEP#1 | Human Resources | ORG#1SEC#1 | DEP#1 |
+-------+-------+-----------------+------------+--------+
目前我可以针对特定IAM策略中每个组织以硬编码的方式限制访问。 但是,这种方法不具有可扩展性。 如果存在一百个组织,则必须存在一百个用户组,并具有单独的策略。 以下是此策略的示例。
是否有任何方法创建一个利用自定义Cognito变量(例如“organization”)的IAM策略,使我能够创建仅限于以该组织开头的行的单个策略? 我无法使用以下代码使其正常工作。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"dynamodb:GetItem",
"dynamodb:PutItem",
"dynamodb:Query"
],
"Resource": [
"arn:aws:dynamodb:region:id:table/TableName"
],
"Condition": {
"ForAllValues:StringEquals": {
"dynamodb:LeadingKeys": [
"${cognito-identity.amazonaws.com:org}"
]
}
}
}
]
}
编辑说明:为了更清晰,我的问题是在验证过程中动态地将自定义Cognito变量插入IAM策略。
例如,用户A具有自定义Cognito属性custom:org = Acme,而用户B具有自定义Cognito属性custom:org = Globex。
如上所述的单个策略可以直接将此属性插入到策略中,因此一个策略可以用于多个不同组织的用户。
经过进一步的研究,我不确定是否完全可能,但如果有人尝试过类似的操作,我很乐意听取经验。