【问题标题】:Bigquery IAM access from java从 Java 访问 Bigquery IAM
【发布时间】:2018-06-12 15:38:29
【问题描述】:

我想从 java api 授予新用户 bigquery.user 访问权限。但不知何故无法从documentation provided 做。关于 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());
        }
    }

执行后出现以下错误: 线程“主”com.google.api.client.googleapis.json.GoogleJsonResponseException 中的异常:400 错误请求 { “代码”:400, “错误”:[{ “域”:“全球”, "message" : "资源层次结构中不存在角色 (projects/dazzling-byway-184414/roles/bigquery.users)。", “原因”:“错误请求” }], "message" : "资源层次结构中不存在角色 (projects/dazzling-byway-184414/roles/bigquery.users)。", “状态”:“INVALID_ARGUMENT” }

是否有任何特定的传递请求的格式?

【问题讨论】:

  • 我什至尝试过 String targetRole = "roles/bigquery.user";在这种情况下,我得到一个不同的错误:线程“main”com.google.api.client.googleapis.json.GoogleJsonResponseException:400 Bad Request {“code”:400,“errors”:[{“domain”:“ global", "message" : "此资源不支持角色角色/bigquery.user。", "reason" : "badRequest" } ], "message" : "此资源不支持角色角色/bigquery.user .", "status" : "INVALID_ARGUMENT" }
  • 来自sample codeString targetRole = "viewers" 不包括“projects/***/roles/”。你可以试试"bigquery.user" 吗?

标签: google-cloud-platform google-bigquery google-iam google-api-explorer


【解决方案1】:

我同意小夏的评论,你应该尝试使用“bigquery.user”作为目标角色。

要回答有关查找更多有关 IAM 访问的 Java API 文档的其他问题,我将查看 this link 获取 IAM 策略,查看 this link 设置 IAM 策略。 在示例 Java 代码的顶部附近,您将找到有关设置环境以使用 Java API 进行 IAM 访问的说明。示例 Java 代码还可以作为您想要执行的操作的参考。

【讨论】:

  • 我尝试了您提供的文档链接中的示例代码,发现为了将 BigQuery 用户角色分配给现有用户,您需要使用“roles/bigquery.user”作为目标角色,而不是我之前建议的“bigquery.user”。请参阅this link for the reference to the role names
猜你喜欢
  • 2013-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多