Bigquery IAM доступ из Java
Я хочу предоставить новому пользователю bigquery.user доступ из Java API. Но как-то не удалось сделать из предоставленной документации. В отношении вызовов API не так много. Может кто-то указать мне в правильном направлении.
Я использую приведенный ниже код на данный момент:
package com.infy.entitlement;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.googleapis.util.Utils;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.services.cloudresourcemanager.model.GetIamPolicyRequest;
import com.google.api.services.iam.v1.Iam;
import com.google.api.services.iam.v1.IamScopes;
import com.google.api.services.iam.v1.model.Binding;
import com.google.api.services.iam.v1.model.Policy;
import com.google.api.services.iam.v1.model.SetIamPolicyRequest;
final HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
final JsonFactory jsonFactory = Utils.getDefaultJsonFactory();
final GoogleCredential credential = GoogleCredential
.getApplicationDefault(httpTransport, jsonFactory)
.createScoped(IamScopes.all());
final Iam iam = new Iam.Builder(
httpTransport, jsonFactory, credential)
.setApplicationName("SS")
.build();
String[] myViewers = new String[] {"user:testviewer1@gmail.com",
"user:testviewer2@gmail.com"};
String targetRole = "projects/***/roles/bigquery.users";
Policy policy = iam.projects().serviceAccounts().getIamPolicy("projects/***/serviceAccounts/****").execute();
Binding targetBinding = null;
List<Binding> bindings = new ArrayList<Binding>();
if(policy.getBindings() != null){
bindings = policy.getBindings();
}
if(bindings != null){
for (Binding binding : bindings) {
if (binding.getRole().equals(targetRole)) {
targetBinding = binding;
break;
}
}
}
if (targetBinding == null) {
targetBinding = new Binding();
targetBinding.setMembers(Arrays.asList(myViewers));
targetBinding.setRole(targetRole);
bindings.add(targetBinding);
}
policy.setBindings(bindings);
iam.projects().serviceAccounts().setIamPolicy("projects/****/serviceAccounts/******", SetIamPolicyRequest.class.newInstance().setPolicy(policy)).execute();
System.out.println(targetBinding.getRole());
}
}
После выполнения я получаю следующую ошибку: Исключение в потоке "main" com.google.api.client.googleapis.json.GoogleJsonResponseException: 400 Bad Request { "code": 400, "errors": [ { "domain": "global", "message": "Role (projects/dazzling-byway-184414/role /bigquery.users) не существует в иерархии ресурса.", "reason": "badRequest" } ], "message": "Role (projects/dazzling-byway-184414/role /bigquery.users) не существует в иерархии ресурса.", "status": "INVALID_ARGUMENT" }
Есть ли какой-то конкретный формат передачи запроса?
1 ответ
Я согласен с комментарием, оставленным Xiaoxia, что вы должны попытаться использовать "bigquery.user" в качестве целевой роли.
Чтобы ответить на ваш другой вопрос о поиске дополнительной документации по Java API для доступа к IAM, я хотел бы взглянуть на эту ссылку для получения политики IAM и эту ссылку для настройки политики IAM. В верхней части примера кода Java вы найдете инструкции по настройке среды для использования API Java для доступа к IAM. Пример Java-кода также служит ссылкой на то, что вы хотите сделать.