Tableau CRMのセキュリティ述語について

Tableau CRMでセキュリティ述語を実装する方法について記載します。

## セキュリティ述語とは？
セキュリティ述語を使用すると一つのテーブル、ダッシュボードでもログインするユーザーによって見せる範囲を制限する**「行レベルセキュリティ」**が実現出来ます。セキュリティ述語ではフィルターではなくそもそもデータ自体が表示されなくなるので非常に高いセキュリティでデータを表示出来ます。
Tableau CRMでは行レベルのセキュリティを実装する方法が大きく2種類あります。

- Salesforceのセキュリティを継承する
- セキュリティ述語を実装する

[Salesforceのセキュリティを継承する](https://help.salesforce.com/s/articleView?id=sf.bi_security_datasets_sharing_about.htm&language=ja&r=https%3A%2F%2Fwww.google.com%2F&type=5)方法では**Salesforce側で設定されているロールベースセキュリティなどをそのままTableau CRM上でも適用します。**

[セキュリティ述語](https://help.salesforce.com/s/articleView?id=sf.bi_security_datasets_predicate_considerations.htm&type=5)を使用すると**Salesforceのセキュリティ設定とは別の条件でセキュリティを実装したり、外部から取り込みのデータにセキュリティを実装、また顧客やパートナーに対してデータ共有を行うExperience Cloud Analyticsなどでよく実装されます。**

Salesforceのセキュリティの上でデータ配信を行うマルチテナントDBが実現出来ますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260655/f3bf4fdc-3da2-efc9-2543-060859eac1d6.png)

今回はSalesforceのデータではなくCSVファイルからUploadしたファイルを元にどのようにセキュリティ述語を設定していくのか説明します。



##サンプルデータ
このようなデータを前提に話をします

| 製品 | 売上 | 担当者 |
|:-:|:-:|:-:|
|AA|1000|Discovery|
|BB|2000|Astro|
|CC|3000|Astro|
|BB|2000|Discovery|

担当者欄を元にログインユーザー名と一致するものだけ表示します。

###データアップロード
データセットの画面で「セキュリティ述語」の設定があり、規定では”なし”になっています。
この状態ではTableau CRMにログイン出来るユーザーは４行全て見ることが出来ます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260655/af0b62fb-76d4-d155-2f45-f502ecf2f225.png)

### API名の取得

こちらにフィルター条件を設定していきます。担当者で絞り込みを行いたいので、担当者のAPI名を確認します。
Salesforceから取得したデータセットの場合はSalesforceのAPI名が使えますが、CSVファイルベースのデータセットだとロード時に自動的に名前が振られます。

一度データセットを開いて「項目パネル」で「項目のAPI参照名を表示」をチェックするとAPI名が判明します。
担当者はColumn3ですので、フィルター条件はこちらを使います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260655/c21f09db-9001-a475-5b97-4220fc5dbac4.png)

### 静的なセキュリティ述語

セキュリティ述語では文字列を指定することもできるので、”Discovery”担当者のデータだけを表示する設定を試します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260655/358531cc-3ecc-8b3d-5dfe-b3f3cb686882.png)

### ユーザー情報を使用したセキュリティ述語

ユーザーオブジェクト情報を使用してセキュリティ述語を使うことも出来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260655/5b3a5f16-a48a-216f-32b6-82c1d4eed0b4.png)


## 階層を持ったユーザー絞り込み
例えばマネージャーは自分の部下のデータは見えるようにしたいなど階層化したアクセス権限を実装したい場合はフィルターも複数項目用意します。

| 製品 | 売上 | 担当者 |マネージャー|
|:-:|:-:|:-:|:-:|
|AA|1000|Discovery|SalesManager|
|BB|2000|Astro|SalesManager|
|CC|3000|Astro|SalesManager|
|BB|2000|Discovery|MarketingManager|

この場合は担当者 or マネージャーに自分の名前があればアクセス可能と言う設定にします。
マネージャーのAPIはColumn4とすると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260655/c738db0b-87a4-1bcb-3cdd-51e47a20328f.png)

このように複数の条件をorで指定します。カラムと条件を階層分追加すれば幾らでも追加出来ます。

## レシピ／データフローでの設定
これで実装可能になりましたが、日時処理などで定期的に更新されるデータセットの場合はレシピなどでデータを作成する際にセキュリティ述語を設定するのがベストプラクティスです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260655/b7489ea7-0749-6d2b-5190-e9a15c11f227.png)

レシピで言うと「出力」オペレーターの中でセキュリティ述語を指定することが出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260655/9c27dd76-db25-001c-a849-4ffcfc032519.png)


セキュリティ述語についての詳細は[データセットの述語式](https://help.salesforce.com/s/articleView?id=sf.bi_security_datasets_predicate_syntax.htm&type=5)の構文を御覧ください