通过Java SDK查询权限信息

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支持您通过如下两种方式运行查询权限相关命令,您可以根据实际需要选择合适的查询方式:

支持查询的权限

MaxCompute支持您通过Java SDK查询以下权限信息:

  • 查询MaxCompute项目内用户或角色的权限

    • 查询用户或角色对MaxCompute项目内非共享资源的权限,SQL语法格式如下。

      show grants for {<user_name>|<role_name>};
      • user_name:查询用户权限时,必填。指定阿里云账号或RAM用户的账号。获取方式,请参见查看用户列表

      • role_name:查询角色权限时,必填。指定角色的名称。获取方式,请参见查看角色列表

    • 查询用户或角色对MaxCompute项目内共享资源的权限,SQL语法格式如下。

      show grants for {<user_name>|<role_name>} privilegeproperties ("refobject"="true");
      • user_name:查询用户权限时,必填。指定阿里云账号或RAM用户的账号。获取方式,请参见查看用户列表

      • role_name:查询角色权限时,必填。指定角色的名称。获取方式,请参见查看角色列表

  • 查询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:必填。指定角色的名称。获取方式,请参见查看角色列表

上述权限查询使用示例,请参见查询结果示例

操作步骤

  1. 启动IntelliJ IDEA,在顶部菜单栏,选择File > Open,打开已创建的Project。例如Project2

  2. 在左侧导航栏的Java Module目录下,选择src > main > java,在Java文件夹上单击右键,选择New > MaxCompute Java

    创建Java脚本

  3. 选择Java Class类型为UDF,并填写Java Class名称,例如OdpsSdk,按下Enter键。

    Java class命名

  4. 在编辑界面开发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 ID和AccessKey Secret保存在环境变量为例说明。您也可以根据业务需要,保存到配置文件里
    				// 强烈建议不要把 AccessKey ID和AccessKey Secret保存到代码里,会存在密钥泄漏风险
            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名称保持一致。

    • ALIBABA_CLOUD_ACCESS_KEY_ID:需配置同名环境变量,存放访问MaxCompute项目的阿里云账号的AccessKey ID。您可以单击AccessKey 管理,获取AccessKey ID。

    • ALIBABA_CLOUD_ACCESS_KEY_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
            }
        }
    }
  5. 在左侧导航栏找到新创建的Java Class,在Java Class上单击右键,选择Run 'class_name.main()',运行Java脚本。

    运行脚本

  6. 在IntelliJ IDEA界面下方的脚本运行结果区域,查看权限查询结果。

    运行结果

查询结果示例

  • 查询MaxCompute项目内用户或角色的权限

    • 示例1:查询用户或角色对MaxCompute项目内非共享资源的权限。

      SQL语句示例:show grants for ALIYUN$odpstest2@aliyun.com;

      命令行执行窗口的输出结果如下。

      #ALIYUN$odpstest2@aliyun.com拥有的角色。
      [roles]        
      r1
      
      #ALIYUN$odpstest2@aliyun.com拥有的ACL权限。
      Authorization Type: ACL            
      [user/ALIYUN$odpstest2@aliyun.com]
      A    projects/new_priv_prj_1: All
      A    projects/new_priv_prj_1/tables/test_1: All
      
      #ALIYUN$odpstest2@aliyun.com拥有的Policy权限。
      Authorization Type: Policy        
      [role/r1]
      #AC中的A表示Allow,C表示授权带有Condition。如果出现D表示Deny。
      AC    projects/new_priv_prj_1/tables/test2: Select  
      
      #ALIYUN$odpstest2@aliyun.com创建的表。
      Authorization Type: ObjectCreator 
      #AG中的A表示Allow,G表示Grant权限。
      AG    projects/new_priv_prj_1/tables/user_t: All   

      通过SDK输出的JSON格式结果如下。

      {
          "ACL": {"user/ALIYUN$odpstest2@aliyun.com": [{
                      "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 ALIYUN$odpstest2@aliyun.com privilegeproperties ("refobject" = "true");

      命令行执行窗口的输出结果如下。

      #ALIYUN$odpstest2@aliyun.com拥有的角色。
      [roles]   
      r1
      #ALIYUN$odpstest2@aliyun.com拥有的共享资源的权限。
      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/ALIYUN$odpstest1@aliyun.com: All
      AG    object_creator/ALIYUN$odpstest1@aliyun.com: All
      
      #test_1通过ACL方式授予的用户。
      Authorization Type: ACL   
      A    user/ALIYUN$odpstest2@aliyun.com: All

      通过SDK输出的JSON格式结果如下。

      {"ACL": {"": [{
                      "Action": ["All"],
                      "Effect": "",
                      "Principal": ["user/ALIYUN$odpstest2@aliyun.com"]}]}}
    • 示例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/ALIYUN$odpstest2@aliyun.com: Select

      通过SDK输出的JSON格式结果如下。

      {"SharedObjectACL": {"pkg1_prj1_1": [{
                      "Action": ["Select"],
                      "Effect": "",
                      "Principal": ["user/ALIYUN$odpstest2@aliyun.com"]}]}}
    • 示例4:查询角色授予的用户信息。

      SQL语句示例:show principals r1;

      命令行执行窗口的输出结果如下。

      #角色授予的用户。
      ALIYUN$odpstest2@aliyun.com

      通过SDK输出的JSON格式结果如下。

      ["ALIYUN$odpstest2@aliyun.com"]