[BigQuery API(V2)] JavaでBigQueryテーブルの行レベルのアクセス制御ポリシーのリストを取得する

BigQuery API V2(Java)を使用して、
BigQueryテーブルの行レベルのアクセス制御ポリシーのリストを取得する方法
についてご紹介します。

**行レベルのアクセス制御ポリシー**
行レベルのセキュリティを使用すると、データをフィルタリングし、ユーザーの資格条件に基づいて
テーブル内の特定の行へのアクセスを許可できます。
詳細は、[⧉BigQuery の行レベルのセキュリティの概要(公式)](https://cloud.google.com/bigquery/docs/row-level-security-intro?hl=ja)を参照ください。

アクセス制御ポリシーを取得するには、
適切なIAM権限が付与されている必要があります。

権限付与に関しては
[⧉[BigQuery API(V2)] JavaでBigQueryを使う(2.権限付与)](https://qiita.com/doran/items/8b7ba29672527426e88d#2-権限付与)
を参照ください。

:::note info
APIを利用する環境の準備から始める場合や、コードを実行する際は、
[⧉[BigQuery API(V2)] JavaでBigQueryを使う](https://qiita.com/doran/items/8b7ba29672527426e88d)
を参照ください。
:::

|No||目次|
|---|---|---|
|1||[アクセス制御ポリシーリストを取得](#1-アクセス制御ポリシーリストを取得)|
||1|[スコープ](#11-スコープ)|
||2|[実行](#12-実行)|
||3|[レスポンスの内容](#13-レスポンスの内容)|
|2||[アクセス制御ポリシーを取得](#2-アクセス制御ポリシーを取得)|
||1|[スコープ](#21-スコープ)|
||2|[実行](#22-実行)|
||3|[レスポンスの内容](#23-レスポンスの内容)|

## 1. アクセス制御ポリシーリストを取得
指定したテーブルの行単位のアクセス制御ポリシーリストを取得します。

### 1.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。
```
BigqueryScopes.BIGQUERY
BigqueryScopes.CLOUD_PLATFORM
BigqueryScopes.CLOUD_PLATFORM_READ_ONLY
https://www.googleapis.com/auth/bigquery.readonly
```
[⧉[BigQuery API(V2)] JavaでBigQueryを使う(3.2. BigQueryインスタンスを取得)](https://qiita.com/doran/items/8b7ba29672527426e88d#32-bigqueryインスタンスを取得)
でスコープを指定してください。

### 1.2. 実行

```java
public static void main(String[] args) throws Exception{
    Bigquery bigquery = getBigquery();
    Bigquery.RowAccessPolicies policies = bigquery.rowAccessPolicies();
    
    Bigquery.RowAccessPolicies.List list = policies.list("プロジェクトID","データセットID","テーブルID");
    
    ListRowAccessPoliciesResponse res = list.execute();
    System.out.println(res);
}
```
#### 1.2.1. HTTPリクエスト
GET:　https:\//bigquery.googleapis.com/bigquery/v2/projects/{プロジェクトID}/datasets/{データセットID}/tables/{テーブルID}/rowAccessPolicies
が実行されます。

#### 1.2.2. クエリパラメータ
Bigquery.RowAccessPolicies.Listメソッドにより、クエリパラメータを追加できます。

|メソッド|引数|説明|
|---|---|---|
|setPageToken|String|ページトークン|
|setPageSize|Integer|取得する最大数|

### 1.3. レスポンスの内容
#### ListRowAccessPoliciesResponse
|メソッド|戻り値|説明|
|---|---|---|
|getRowAccessPolicies|List\<[RowAccessPolicy](#rowaccesspolicy)\>|テーブルの行アクセスポリシー|
|getNextPageToken|String|次のページのトークン|

#### RowAccessPolicy
|メソッド|戻り値|説明|
|---|---|---|
|getEtag|String|ハッシュ値|
|getRowAccessPolicyReference|[RowAccessPolicyReference](#rowaccesspolicyreference)|行アクセスポリシーのリファレンス|
|getFilterPredicate|String|行アクセスポリシーによって定義された行を表すSQLブール式|
|getCreationTime|String|行アクセスポリシーが作成された時刻(ミリ秒)|
|getLastModifiedTime|String|行アクセスポリシーが最後に変更された時刻(ミリ秒)|

#### RowAccessPolicyReference
|メソッド|戻り値|説明|
|---|---|---|
|getProjectId|String|プロジェクトID|
|getDatasetId|String|データセットID|
|getTableId|String|テーブルID|
|getPolicyId|String|行アクセスポリシーID|

## 2. アクセス制御ポリシーを取得
指定した行アクセスポリシーの情報を取得します。

### 2.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。
```
BigqueryScopes.BIGQUERY
BigqueryScopes.CLOUD_PLATFORM
BigqueryScopes.CLOUD_PLATFORM_READ_ONLY
https://www.googleapis.com/auth/bigquery.readonly
```
[⧉[BigQuery API(V2)] JavaでBigQueryを使う(3.2. BigQueryインスタンスを取得)](https://qiita.com/doran/items/8b7ba29672527426e88d#32-bigqueryインスタンスを取得)
でスコープを指定してください。

### 2.2. 実行

```java
public static void main(String[] args) throws Exception{
    Bigquery bigquery = getBigquery();
    Bigquery.RowAccessPolicies policies = bigquery.rowAccessPolicies();
    
    String resource = String.format(
                "projects/%s/datasets/%s/tables/%s/rowAccessPolicies/%s", 
                "プロジェクトID",
                "データセットID",
                "テーブルID",
                "行アクセスポリシーID");
    GetIamPolicyRequest content = new GetIamPolicyRequest();
    Bigquery.RowAccessPolicies.GetIamPolicy get = policies.getIamPolicy(resource,content);
    
    Policy res = get.execute();
    System.out.println(res);
}
```
#### 2.2.1. HTTPリクエスト
POST:　https:\//bigquery.googleapis.com/bigquery/v2/projects/{プロジェクトID}/datasets/{データセットID}/tables/{テーブルID}/rowAccessPolicies/{行アクセスポリシーID}:getIamPolicy
が実行されます。

#### 2.2.2. クエリパラメータ
クエリパラメータはありません。

#### 2.2.3. リクエストボディ
GetIamPolicyRequestメソッドにより、リクエストボディを追加できます。

|メソッド|引数|説明|
|---|---|---|
|setOptions|[GetPolicyOptions](#getpolicyoptions)|オプションを指定するためのオブジェクト|

#### GetPolicyOptions
|メソッド|引数|説明|
|---|---|---|
|setRequestedPolicyVersion|Integer|ポリシーのフォーマットに使用されるポリシーの最大バージョン|

### 2.3. レスポンスの内容
#### Policy
|メソッド|戻り値|説明|
|---|---|---|
|getVersion|Integer|ポリシーの形式
|getBindings|List\<[Binding](#binding)\>|関連付け|
|getAuditConfigs|List\<[AuditConfig](#auditconfig)\>|ポリシーのクラウド監査ログ構成|
|getEtag|String|ハッシュ値|

#### Binding

|メソッド|戻り値|説明|
|---|---|---|
|getRole|String|割り当てられるロール|
|getMembers|List\<String\>|[メンバのプリンシパル](#メンバのプリンシパル)|
|getCondition|[Expr](#expr)|バインディングに関連付けられている条件|

#### Expr
|メソッド|戻り値|説明|
|---|---|---|
|getExpression|String|共通式言語構文での式のテキスト表現
|getTitle|String|式のタイトル|
|getDescription|String|式の説明|
|getLocation|String|ファイル名やファイル内の位置などエラー報告用の式の場所を示す文字列|

#### AuditConfig

|メソッド|戻り値|説明|
|---|---|---|
|getService|String|監査ログを有効にするサービス|
|getAuditLogConfigs|List\<[AuditLogConfig](#auditlogconfig)\>|各タイプの権限のログを記録するための設定|

#### AuditLogConfig
|メソッド|戻り値|説明|
|---|---|---|
|getLogType|[LogType(enum)](#logtype)|構成で有効になるログのタイプ|
|getExemptedMembers|List\<String\>|アクセス許可のログを記録しないタイプ|

#### LogType
|定義値|内容|
|---|---|
|LOG_TYPE_UNSPECIFIED|使用不可|
|ADMIN_READ|管理人が読込|
|DATA_WRITE|データの書込|
|DATA_READ|データの読込|

#### メンバのプリンシパル
|定義値|内容|
|---|---|
|allUsers|インターネット上のすべてのユーザーを表す特別な識別子|
|allAuthenticatedUsers|Googleアカウントまたはサービスアカウントで認証されたユーザーを表す特別な識別子|
|user{emailid}|特定のGoogleアカウントを表すメールアドレス|
|serviceAccount:{emailid}|Googleサービスアカウントを表す電子メールアドレス|
|serviceAccount:{projectid}.svc.id.goog[{namespace}/{kubernetes-sa}]|Kubernetesサービスアカウントの識別子|
|group:{emailid}|Googleグループを表すメールアドレス|
|domain:{domain}|そのドメインのすべてのユーザーを表すGSuiteドメイン(プライマリ)|
|principal://iam.googleapis.com/locations/global/workforcePools/{pool_id}/subject/{subject_attribute_value}|WorkforceIdentityプール内の単一のID|
|principalSet://iam.googleapis.com/locations/global/workforcePools/{pool_id}/group/{groupId}|グループ内のすべての従業員のアイデンティティ|
|principalSet://iam.googleapis.com/locations/global/workforcePools/{pool_id}/attribute.{attribute_name}/{attribute_value}|特定の属性値を持つすべての従業員ID|
|principalSet://iam.googleapis.com/locations/global/workforcePools/{pool_id}/*|WorkforceIdentityプール内のすべてのID|
|principal://iam.googleapis.com/projects/{project_number}/locations/global/workloadIdentityPools/{pool_id}/subject/{subject_attribute_value}|WorkloadIdentityプール内の単一のID|
|principalSet://iam.googleapis.com/projects/{project_number}/locations/global/workloadIdentityPools/{pool_id}/group/{groupId}|WorkloadIdentityプールグループ|
|principalSet://iam.googleapis.com/projects/{project_number}/locations/global/workloadIdentityPools/{pool_id}/attribute.{attribute_name}/{attribute_value}|特定の属性を持つWorkloadIdentityプール内のすべてのID|
|principalSet://iam.googleapis.com/projects/{project_number}/locations/global/workloadIdentityPools/{pool_id}/*|WorkloadIdentityプール内のすべてのID|
|deleted:user:{emailid}?uid={uniqueid}|最近削除されたユーザーを表す電子メールアドレス(および一意の識別子)|
|deleted:serviceAccount:{emailid}?uid={uniqueid}|最近削除されたサービスアカウントを表す電子メールアドレス(および一意の識別子)|
|deleted:group:{emailid}?uid={uniqueid}|最近削除されたGoogleグループを表すメールアドレス(および一意の識別子)|
|deleted:principal://iam.googleapis.com/locations/global/workforcePools/{pool_id}/subject/{subject_attribute_value}|最近削除されたWorkforceIdentityプール内の単一ID|

<br>
<br>
おしまい。。