我最近进入AWS并与带有发电机ID的发电机表一起使用appsync(来自cognito池),仅向特定用户提供对某些数据的访问权限。现在,我想进一步扩展这一范围,并允许某些认知小组访问。这是我的代码:
1st。我的突变
## [Start] Prepare DynamoDB PutItem Request. **
$util.qr($context.args.input.put("createdAt", $util.time.nowISO8601()))
$util.qr($context.args.input.put("updatedAt", $util.time.nowISO8601()))
$util.qr($context.args.input.put("__typename", "Patient"))
## This line adds the userId, accessed from the $ctx.identity variable
$util.qr($context.args.input.put("userId", $ctx.identity.sub))
$util.qr($context.args.input.put("Groupi", $ctx.identity.claims.get("cognito:groups")))
{
"version": "2017-02-28",
"operation": "PutItem",
"key": {
"id": $util.dynamodb.toDynamoDBJson($util.defaultIfNullOrBlank($ctx.args.input.id, $util.autoId()))
},
"attributeValues": $util.dynamodb.toMapValuesJson($context.args.input),
"condition": {
"expression": "attribute_not_exists(#id)",
"expressionNames": {
"#id": "id"
}
}
}
和查询
#set( $limit = $util.defaultIfNull($context.args.limit, 10) )
{
"version" : "2017-02-28",
"operation" : "Query",
"limit": $limit,
"index": "userId-index",
"query" : {
"expression": "userId = :userId",
"expressionValues" : {
":userId" : $util.dynamodb.toDynamoDBJson($ctx.identity.sub)
}
},
"nextToken": #if( $context.args.nextToken )
"$context.args.nextToken"
#else
null
#end
}
我想扩展查询以同时支持该组。帮助将不胜感激。 谢谢!
答案 0 :(得分:0)
授权文档中有许多示例可能对您有所帮助:https://docs.aws.amazon.com/appsync/latest/devguide/security-authorization-use-cases.html
具体来说,这个:
#set($expression = "")
#set($expressionValues = {})
#foreach($group in $context.identity.claims.get("cognito:groups"))
#set( $expression = "${expression} contains(groupsCanAccess, :var$foreach.count )" )
#set( $val = {})
#set( $test = $val.put("S", $group))
#set( $values = $expressionValues.put(":var$foreach.count", $val))
#if ( $foreach.hasNext )
#set( $expression = "${expression} OR" )
#end
#end
{
"version" : "2017-02-28",
"operation" : "Scan",
"limit": #if(${context.arguments.count}) "${context.arguments.count}" #else 20 #end,
"nextToken": #if(${context.arguments.nextToken}) "${context.arguments.nextToken}" #else null #end,
"filter":{
"expression": "$expression",
"expressionValues": $utils.toJson($expressionValues)
}
}
该示例具有一些额外的信息,因为它与列表调用有关,而不是与简单的获取有关,但是您可以看到在表达式/表达式值中对其进行了设置。此实现看上去与您的实现略有不同,因为它允许用户处于多个组中,任何一个组都可以工作。
这有意义吗?
答案 1 :(得分:0)
这里的其他示例似乎更适合“细粒度访问控制”部分,根据您的需求,这可能是正确的选择:
对于更一般的情况,如果您查看“安全性”文档页面,那么还有一个很好的示例,说明了如何直接在GraphQL模式中直接使用指令:
尤其对于您的用例,@aws_auth
或@aws_cognito_user_pools
指令似乎很重要。完整列表是:
@aws_api_key
-要指定该字段是API_KEY
的授权。@aws_iam
-要指定该字段已获得AWS_IAM
的授权。@aws_oidc
-要指定该字段已获得OPENID_CONNECT
的授权。@aws_cognito_user_pools
-要指定该字段已获得AMAZON_COGNITO_USER_POOLS
的授权。要从文档页面复制示例,请执行以下操作:
type Query {
posts:[Post!]!
@aws_auth(cognito_groups: ["Bloggers", "Readers"])
}
type Mutation {
addPost(id:ID!, title:String!):Post!
@aws_auth(cognito_groups: ["Bloggers"])
}