MaxCompute支持您通过Java SDK方式查询指定用户、角色或资源的授权信息,以JSON格式展示权限查询结果,满足多样化展示需求。本文为您介绍如何通过Java SDK方式查询权限信息并提供相关JSON格式的输出结果示例。
前提条件
请确认您已安装MaxCompute Studio,并已连接MaxCompute项目和创建MaxCompute Java Module。
更多安装MaxCompute Studio信息,请参见 安装MaxCompute Studio 。
更多连接MaxCompute项目信息,请参见 管理项目连接 。
更多创建MaxCompute Java Module信息,请参见 创建MaxCompute Java Module 。
假设MaxCompute Studio上已创建的Project名称为
Project2
,Java Module名称为
mc_java
。
背景信息
MaxCompute支持您通过如下两种方式运行查询权限相关命令,您可以根据实际需要选择合适的查询方式:
-
通过Java SDK方式编写Java脚本,以JSON格式展示权限查询结果。本文仅为您介绍该方式的实现方法。
-
通过 MaxCompute客户端 、 命令行(odpscmd) 、 MaxCompute SQL分析 、 使用DataWorks连接 或 MaxCompute Studio ,运行权限查询相关命令,在命令行执行窗口直观展示权限查询结果。
支持查询的权限
MaxCompute支持您通过Java SDK查询以下权限信息:
-
查询MaxCompute项目内用户或角色的权限
-
查询用户或角色对MaxCompute项目内非共享资源的权限,SQL语法格式如下。
show grants for {<user_name>|<role_name>}; -
查询用户或角色对MaxCompute项目内共享资源的权限,SQL语法格式如下。
show grants for {<user_name>|<role_name>} privilegeproperties ("refobject"="true");
-
-
查询MaxCompute项目内表或角色的对外授权情况
-
查询指定表通过ACL方式授权的情况,SQL语法格式如下。
show grants on table <table_name>;table_name :必填。指定表的名称。获取方式,请参见 列出项目下的表和视图 。
-
查询指定表通过Policy方式授权的情况,SQL语法格式如下。
show grants on table <table_name> privilegeproperties ("policy"="true");table_name :必填。指定表的名称。获取方式,请参见 列出项目下的表和视图 。
-
查询MaxCompute项目内安装的Package中表的ACL授权情况,SQL语法格式如下。
show grants on table <table_name> privilegeproperties ("refobject"="true", "refproject"="<project_name>");-
table_name :必填。指定表的名称。获取方式,请参见 列出项目下的表和视图 。
-
project_name :必填。指定MaxCompute项目的名称。
-
-
查询角色授予的用户信息,SQL语法格式如下。
show principals <role_name>;role_name :必填。指定角色的名称。获取方式,请参见 查看角色列表 。
-
上述权限查询使用示例,请参见 查询结果示例 。
操作步骤
-
启动IntelliJ IDEA,在顶部菜单栏,选择 ,打开已创建的Project。例如
Project2。 -
在左侧导航栏的Java Module目录下,选择 ,在
Java文件夹上单击右键,选择 。
-
选择Java Class类型为 UDF ,并填写Java Class名称,例如
OdpsSdk,按下Enter键。
-
在编辑界面开发Java程序。
Java语法格式如下。
import com.aliyun.odps.Odps; import com.aliyun.odps.OdpsException; import com.aliyun.odps.account.Account; import com.aliyun.odps.account.AliyunAccount; public class <class_name> { public static void main(String[] args) { // TODO Auto-generated method stub // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户 // 此处以把AccessKey 和 AccessKeySecret 保存在环境变量为例说明。您也可以根据业务需要,保存到配置文件里 // 强烈建议不要把 AccessKey 和 AccessKeySecret 保存到代码里,会存在密钥泄漏风险 Account account = new AliyunAccount(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")); Odps odps = new Odps(account); String odpsUrl = "<endpoint>"; odps.setEndpoint(odpsUrl); odps.setDefaultProject("<project_name>"); try { String out = odps.projects().get("<project_name>").getSecurityManager().runQuery("<SQL>", true); //true表示输出JSON格式。 System.out.print("out: " + out + "\n"); //success if return {} } catch (OdpsException e) { //Exception handling }-
class_name :必填。创建的Java Class名称。必须与 3 中填写的Java Class名称保持一致。
-
AccessKey_ID :必填。访问MaxCompute项目的阿里云账号的AccessKey ID。您可以单击 AccessKey 管理 ,获取AccessKey ID。
-
AccessKey_Secret :必填。AccessKey ID对应的AccessKey Secret。您可以单击 AccessKey 管理 ,获取AccessKey Secret。
-
endpoint :必填。目标MaxCompute项目所属地域的Endpoint。更多Endpoint信息,请参见 Endpoint 。
-
project_name :必填。目标MaxCompute项目的名称。
-
SQL :必填。查询权限信息的SQL语句。SQL语句格式请参见 支持查询的权限 。
Java脚本示例如下。
import com.aliyun.odps.Odps; import com.aliyun.odps.OdpsException; import com.aliyun.odps.account.Account; import com.aliyun.odps.account.AliyunAccount; public class OdpsSdk { public static void main(String[] args) { // TODO Auto-generated method stub // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户 // 此处以把AccessKey 和 AccessKeySecret 保存在环境变量为例说明。您也可以根据业务需要,保存到配置文件里 // 强烈建议不要把 AccessKey 和 AccessKeySecret 保存到代码里,会存在密钥泄漏风险 Account account = new AliyunAccount(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")); Odps odps = new Odps(account); String odpsUrl = "http://service.cn-hangzhou.maxcompute.aliyun.com/api"; odps.setEndpoint(odpsUrl); odps.setDefaultProject("doc_test_dev"); try { String out = odps.projects().get("doc_test_dev").getSecurityManager().runQuery("show grants for ALIYUN$****@test.aliyunid.com;", true); System.out.print("out: " + out + "\n"); //success if return {} } catch (OdpsException e) { //Exception handling } -
-
在左侧导航栏找到新创建的Java Class,在Java Class上单击右键,选择 Run 'class_name.main()' ,运行Java脚本。
-
在IntelliJ IDEA界面下方的脚本运行结果区域,查看权限查询结果。
查询结果示例
-
查询MaxCompute项目内用户或角色的权限
-
示例1:查询用户或角色对MaxCompute项目内非共享资源的权限。
SQL 语句示例:
show grants for [email protected];。命令行执行窗口的输出结果如下。
#[email protected]拥有的角色。 [roles] #[email protected]拥有的ACL权限。 Authorization Type: ACL [user/[email protected]] A projects/new_priv_prj_1: All A projects/new_priv_prj_1/tables/test_1: All #[email protected]拥有的Policy权限。 Authorization Type: Policy [role/r1] #AC中的A表示Allow,C表示授权带有Condition。如果出现D表示Deny。 AC projects/new_priv_prj_1/tables/test2: Select #[email protected]创建的表。 Authorization Type: ObjectCreator #AG中的A表示Allow,G表示Grant权限。 AG projects/new_priv_prj_1/tables/user_t: All通过SDK输出的JSON格式结果如下。
{ "ACL": {"user/[email protected]": [{ "Action": ["All"], "Effect": "", "Resource": ["acs:odps:*:projects/new_priv_prj_1/tables/test_1"]}, "Action": ["All"], "Effect": "", "Resource": ["projects/new_priv_prj_1"]}]}, "POLICY": {"role/r1": [{ "Action": ["odps:Select"], "Condition": {"IpAddress": {"acs:SourceIp": ["10.10.10.10", "10.10.10.10/4"]}}, "Effect": "Allow", "Resource": ["acs:odps:*:projects/new_priv_prj_1/tables/test2"]}]}, "SuperPrivs": [] } -
示例2:查询用户或角色对MaxCompute项目内共享资源的权限。
SQL 语句示例:
show grants for [email protected] privilegeproperties ("refobject" = "true");。命令行执行窗口的输出结果如下。
#[email protected]拥有的角色。 [roles] #[email protected]拥有的共享资源的权限。 Authorization Type: InstalledObjecACL [pkg1_prj1_1] A projects/new_priv_prj_2/tables/prj2_tb1: Select通过SDK输出的JSON格式结果如下。
{"SharedObjectACL": {"pkg1_prj1_1": [{ "Action": ["Select"], "Effect": "", "Resource": ["acs:odps:*:projects/new_priv_prj_2/tables/prj2_tb1"]}]}}
-
-
查询MaxCompute项目内表或角色的授权情况
-
示例1:查询指定表通过ACL方式授权的情况。
SQL 语句示例:
show grants on table test_1;。命令行执行窗口的输出结果如下。
#执行授权操作的用户身份是Project Owner或表test_1的创建者。 Authorization Type: Implicit AG project_owner/[email protected]: All AG object_creator/[email protected]: All #test_1通过ACL方式授予的用户。 Authorization Type: ACL A user/[email protected]: All通过SDK输出的JSON格式结果如下。
{"ACL": {"": [{ "Action": ["All"], "Effect": "", "Principal": ["user/[email protected]"]}]}} -
示例2:查询指定表通过Policy方式授权的情况。
SQL 语句示例:
show grants on table test2 privilegeproperties ("policy" = "true");。命令行执行窗口的输出结果如下。
#执行授权操作的用户身份是Project Owner。 Authorization Type: Implicit AG project_owner/: All #test2通过Policy方式授予的角色。 Authorization Type: Policy [role/r1]通过SDK输出的JSON格式结果如下。
{"POLICY": {"role/r1": [{ "Action": ["odps:Select"], "Condition": {"IpAddress": {"acs:SourceIp": ["10.10.10.10", "10.10.10.10/4"]}}, "Effect": "Allow", "Resource": ["acs:odps:*:projects/new_priv_prj_1/tables/test2"]}]}} -
示例3:查询MaxCompute项目内安装的Package的ACL授权情况。
SQL 语句示例:
show grants on table prj2_tb1 privilegeproperties ("refobject" = "true", "refproject"="new_priv_prj_2");。命令行执行窗口的输出结果如下。
#执行授权操作的用户身份是Project Owner。 Authorization Type: Implicit AG project_owner/: All Authorization Type: InstalledObjecACL #Package的名称。 [pkg1_prj1_1] #Pckage通过ACL方式授予的用户。 A user/[email protected]: Select通过SDK输出的JSON格式结果如下。
{"SharedObjectACL": {"pkg1_prj1_1": [{ "Action": ["Select"], "Effect": "", "Principal": ["user/[email protected]"]}]}} -
示例4:查询角色授予的用户信息。
SQL 语句示例:
show principals r1;。命令行执行窗口的输出结果如下。
#角色授予的用户。 [email protected]通过SDK输出的JSON格式结果如下。
["[email protected]"]
-