全部產品
Search
文件中心

MaxCompute:通過Java SDK查詢許可權資訊

更新時間:May 21, 2025

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用戶端使用DataWorks串連MaxCompute Studio,運行許可權查詢相關命令,在命令列執行視窗直觀展示許可權查詢結果。

支援查詢的許可權

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。

    • 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"]