在获得答案之前,请确保已启用资源管理器 API 。这对于 REST 方法和编程方法是必要的。
要修改给定项目中用户的 IAM 绑定,需要调用两个端点,此处记录了它们。那些将是:
- 要获取当前的 IAM 配置:https ://cloud.google.com/resource-manager/reference/rest/v1/projects/getIamPolicy
- 设置新的 IAM 政策:https ://cloud.google.com/resource-manager/reference/rest/v1/projects/setIamPolicy
在第 1 步和第 2 步之间,需要修改第一个端点返回的 json,要么添加具有您选择的角色的用户,要么从中删除用户条目。要查看添加/删除用户所需的 json 结构是什么,我建议检查上面共享的链接以及检查第一个命令返回的有效负载。
虽然直接调用 REST api 是您可以使用的一种选择,但您也可以使用 gcloud CLI 来执行此类操作。看起来用户将被一一添加/删除,命令行将是一个简单的选择,而且它需要较少的设置。这两个动作的命令是:
/ To add user role
gcloud projects add-iam-policy-binding PROJECT_ID --member=user:somebody@example.com --role=roles/viewer
/ To remove user role
gcloud projects remove-iam-policy-binding PROJECT_ID --member=user:somebody@example.com --role=roles/viewer
第三种选择是以编程方式进行。虽然我想提供一个 PHP 示例,但我没有足够的语言经验,但下面是一个允许添加/删除角色的 Python 脚本。它是从快速入门中引导出来的,只是做了一些小的改动,从我运行的测试来看,它应该可以正常工作。
# TODO: Install required libraries
# pip3 install --upgrade google-api-python-client google-auth google-auth-httplib2
import os
from google.oauth2 import service_account
import googleapiclient.discovery
def get_policy(crm_service, project_id, version=3):
"""Gets IAM policy for a project."""
policy = (
crm_service.projects()
.getIamPolicy(
resource=project_id,
body={"options": {"requestedPolicyVersion": version}},
)
.execute()
)
print(policy)
return policy
def set_policy(crm_service, project_id, policy):
"""Sets IAM policy for a project."""
policy = (
crm_service.projects()
.setIamPolicy(resource=project_id, body={"policy": policy})
.execute()
)
return policy
def initialize_service():
"""
Initializes a Cloud Resource Manager service.
The Environemnt variable GOOGLE_APPLICATION_CREDENTIALS must point to the service account key.json file
"""
credentials = service_account.Credentials.from_service_account_file(
filename=os.environ["GOOGLE_APPLICATION_CREDENTIALS"],
scopes=["https://www.googleapis.com/auth/cloud-platform"],
)
crm_service = googleapiclient.discovery.build(
"cloudresourcemanager", "v1", credentials=credentials
)
return crm_service
def modify_policy_add_role(crm_service, project_id, role, member):
"""Adds a new role binding to a policy."""
policy = get_policy(crm_service, project_id)
binding = None
for b in policy["bindings"]:
if b["role"] == role:
binding = b
break
if binding is not None and member not in binding["members"]:
binding["members"].append(member)
else:
binding = {"role": role, "members": [member]}
policy["bindings"].append(binding)
policy = set_policy(crm_service, project_id, policy)
def modify_policy_remove_member(crm_service, project_id, role, member):
"""Removes a member from a role binding."""
policy = get_policy(crm_service, project_id)
# The try-except below handles the case where the role isn't in the IAM policy
try:
binding = next(b for b in policy["bindings"] if b["role"] == role)
except StopIteration:
print("The role is not included in the IAM policy. Can't remove user")
raise KeyError
if "members" in binding and member in binding["members"]:
binding["members"].remove(member)
set_policy(crm_service, project_id, policy)
if __name__ == '__main__':
# TODO: Replace with your project ID
project_id = "projectID"
# TODO: Replace with the ID of your member in the form 'user:member@example.com'.
member = "user:somebody@example.com"
# TODO: Replace the role with the role you want to grant/remove
role = "roles/logging.logWriter"
# Initializes the client.
crm_service = initialize_service()
# Call modify_policy_add_role or modify_policy_remove_member as required
modify_policy_add_role(crm_service, project_id, role, member)
modify_policy_remove_member(crm_service, project_id, role, member)