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,在頂部菜單欄,選擇
Project2
。 ,打開已創建的Project。例如在左側導航欄的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 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 } } }
在左側導航欄找到新創建的Java Class,在Java Class上單擊右鍵,選擇Run 'class_name.main()',運行Java腳本。
在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"]