Google cloud platform 从java访问Bigquery IAM

Google cloud platform 从java访问Bigquery IAM,google-cloud-platform,google-bigquery,google-iam,google-api-explorer,Google Cloud Platform,Google Bigquery,Google Iam,Google Api Explorer,我想从java api授予新用户bigquery.user访问权限。但不知何故无法从根本上做到。API调用方面没有太多内容。有人能给我指一下正确的方向吗 我现在正在使用以下代码: package com.infy.entitlement; import java.io.IOException; import java.security.GeneralSecurityException; import java.util.ArrayList; import java.util.Arrays; i

我想从java api授予新用户bigquery.user访问权限。但不知何故无法从根本上做到。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());
        }
    }
package com.infy.authority;
导入java.io.IOException;
导入java.security.GeneralSecurityException;
导入java.util.ArrayList;
导入java.util.array;
导入java.util.List;
导入com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
导入com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
导入com.google.api.client.googleapis.util.Utils;
导入com.google.api.client.http.HttpTransport;
导入com.google.api.client.json.JsonFactory;
导入com.google.api.services.cloudresourcemanager.model.GetIamPolicyRequest;
导入com.google.api.services.iam.v1.iam;
导入com.google.api.services.iam.v1.IamScopes;
导入com.google.api.services.iam.v1.model.Binding;
导入com.google.api.services.iam.v1.model.Policy;
导入com.google.api.services.iam.v1.model.SetIamPolicyRequest;
最终HttpTransport HttpTransport=GoogleNetHttpTransport.newTrustedTransport();
final JsonFactory JsonFactory=Utils.getDefaultJsonFactory();
最终GoogleCredential凭证=GoogleCredential凭证
.getApplicationDefault(httpTransport,jsonFactory)
.createScope(IamScopes.all());
最终Iam Iam=新Iam.Builder(
httpTransport、jsonFactory、凭证)
.setApplicationName(“SS”)
.build();
字符串[]MyViewer=新字符串[]{“用户:testviewer1@gmail.com",
“用户:testviewer2@gmail.com"};
字符串targetRole=“projects/***/roles/bigquery.users”;
Policy Policy=iam.projects().serviceAccounts().getIamPolicy(“projects/***/serviceAccounts/***”).execute();
Binding targetBinding=null;
列表绑定=新建ArrayList();
if(policy.getBindings()!=null){
bindings=policy.getBindings();
}
if(绑定!=null){
for(绑定:绑定){
if(binding.getRole().equals(targetRole)){
targetBinding=绑定;
打破
}
}
}
if(targetBinding==null){
targetBinding=新绑定();
setMembers(Arrays.asList(myViewers));
targetBinding.setRole(targetRole);
bindings.add(targetBinding);
}
策略设置绑定(绑定);
iam.projects().serviceAccounts().setIamPolicy(“projects/******/serviceAccounts/*******”,SetIAMPolicRequest.class.newInstance().setPolicy(policy)).execute();
System.out.println(targetBinding.getRole());
}
}
执行后,我得到以下错误: 线程“main”com.google.api.client.googleapis.json.GoogleJsonResponseException中出现异常:400错误请求 { “代码”:400, “错误”:[{ “域”:“全局”, “消息”:“资源的层次结构中不存在角色(projects/projects-byway-184414/roles/bigquery.users)。”, “原因”:“坏请求” } ], “消息”:“资源的层次结构中不存在角色(projects/projects-byway-184414/roles/bigquery.users)。”, “状态”:“无效的_参数” }


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

我同意小霞留下的评论,即您应该尝试使用“bigquery.user”作为目标角色

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

我甚至尝试了字符串targetRole=“roles/bigquery.user”;在本例中,我得到一个不同的错误:线程“main”com.google.api.client.googleapis.json.GoogleJsonResponseException:400错误请求{“code”:400,“错误”:[{“domain”:“global”,“message”:“Role roles/bigquery.user不支持此资源。”,“原因”:“badRequest”}],“message”:此资源不支持“Role roles/bigquery.user”。,“status:”字符串targetRole=“viewers”中的“INVALID_ARGUMENT”}不包括“projects/***/roles”/“。您可以尝试一下吗?我尝试了您提供的文档链接中的示例代码,发现为了将BigQuery用户角色分配给现有用户,您需要使用“roles/BigQuery.user”作为目标角色,而不是我以前建议的“BigQuery.user”。请看。