Salesforceデータへのアクセス権の種類と役割について

# これは何？
この記事は「[24日後に立派なSalesforceエンジニアになるWEBエンジニア Advent Calendar 2022](https://qiita.com/advent-calendar/2022/kakakaori)」の4日目の記事です。21日後に立派なSalesforceエンジニアになるために今日はSalesforce管理者と切っても切り離せない権限設定について学びます。

この記事では権限設定の中でも一番ややこしい（と感じる）データに関する権限にフォーカスを当てて話をしていきます。この辺りは認定アドミニストレーター試験でも頻出の範囲ぽいのでしっかり押さえておくと試験対策としても有効かも。それ以外の制御については別記事で書こうかなと思います。

# 登場人物
権限設定ぽい単語を調べると「プロファイル」「権限セット」「ロール」「共有ルール」が出てくる。色々あるのね。

# データへのアクセス権の種類
Salesforceの権限設定ではデータに関して大きく以下の３つの軸で設定することができる。
1. オブジェクト権限
    - オブジェクトそのものへのアクセス権を制御
1. 項目レベルセキュリティ
    - オブジェクトの中の特定の項目へのアクセス権を制御
1. レコードアクセス権
    - レコード単位でのアクセスを制御

データベースで言う縦方向（テーブルやカラム）単位での制御が「オブジェクト権限・項目レベルセキュリティ」で横方向（レコード）単位での制御が「レコードアクセス権」という感じ。

- 営業は取引先（テーブル）の編集閲覧削除ができるけどマーケは取引先の閲覧しかできない
- CSは顧客の情報が全て閲覧できるが営業は顧客の個人情報の項目（カラム）を閲覧できない

これらを表現するのは「オブジェクト権限・項目レベルセキュリティ」で
- A社（レコード）とB社（レコード）の営業担当だからそれらの取引先情報は閲覧できていいけどC社は担当じゃないからそれは閲覧できないようにしたい
- 営業第1グループのマネージャは営業第1グループの担当する取引先情報（レコード）が全て閲覧できるようにしたい＝つまり営業第２グループの担当する取引先情報は閲覧できないようにしたい

これらを表現するのは「レコードアクセス権」。

またこれら3つは１→２→３の順で権限が優位になってる（１が一番優位）。例えば、取引先オブジェクトに対して閲覧権限しかない場合は、取引先オブジェクトの「名前」という項目に編集アクセス権を持っていても編集はできない。

## オブジェクト権限
![スクリーンショット 2022-12-01 9.37.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/410ddb83-fe1d-e309-ffcf-57a1295248f8.png)
オブジェクトごとに上記のようにアクセス権を設定できる。詳細は以下の通り。

| アクセス権 | チェック有り| チェック無し |
|:-|:-|:-|
|参照|共有設定による|共有設定に関わらず参照不可|
|作成|作成可能|作成不可|
|編集|共有設定による|共有設定に関わらず全レコード編集不可|
|削除|共有設定による|共有設定に関わらず全レコード削除不可|
|すべて表示|共有設定に関わらず全レコード参照可能|共有設定による|
|すべて変更|共有設定に関わらず全レコード参照・編集可能|共有設定による|

※共有設定はすでにあるレコードの権限をどうするかと言うものなので、「作成」に関してはオブジェクト権限だけで完結する。

オブジェクト権限は権限セットかプロファイルで設定ができる。どちらでも設定ができるのでどっちで制御するのがいいのかは考えどころだが、ここについては明日別記事で書く。

## 項目レベルセキュリティ
![スクリーンショット 2022-12-01 12.08.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/e7b48963-2cee-8841-909b-6cf4374a612c.png)
先ほどのものがオブジェクトに対する権限なのに対して、こちらは項目ごとの設定。正社員プロファイルでは取引先のオブジェクトのバジェット項目を参照編集できるが、他のプロファイルではできないようにする、とかが表現できる。
オブジェクト権限同様、項目レベルセキュリティも権限セットかプロファイルで設定ができる。

## レコードアクセス権
レコードアクセス権は共有設定を使って設定ができ、これを使うことで他のユーザが所有するレコードに対してアクセスができるようにする。共有設定は以下の４種類に分けられる。
- 組織の共有設定
- ロール設定
- 共有ルール
- 手動共有


共有設定は上記4つのうち、下に行くにつれての「開放」方面の設定しかできない。つまり「組織の共有設定」では社内の全員が最低限見る必要があるものだけ公開にして、１レコードでも見せたくないものが存在する場合は非公開にしておく。そしてそれ以降の設定により権限を追加することで権限を広げていくという考え方。

### 組織の共有設定
![スクリーンショット 2022-12-01 21.07.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/61f3d661-58f6-b0f5-fc1a-ec09ea858522.png)
オブジェクトごとに誰が参照/編集できるかを決めることができる。自分の所有するレコードへはフルアクセス権（参照・編集・削除・所有者変更・共有）を持つため、種類によって異なるのは非所有者の部分のみである。
| 種類 | レコードの所有者 | 非所有者 |
|:-|:-|:-|
| 非公開  | 参照：○ 更新：○  |  参照：× 更新：×  |
| 公開/参照のみ  | 参照：○ 更新：○   |  参照：○ 更新：×  |
| 公開/参照・更新可能  |  参照：○ 更新：○  |  参照：○ 更新：○  |

### ロール階層
組織図で言う上下階層の共有設定。
![スクリーンショット 2022-12-01 21.18.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/e0a079d1-f52b-2d83-ead6-5cd4e6404de3.png)
先ほどと同じ画面の右側のチェックボックスにチェックが入っているとこのロール階層が有効になり、上位階層の人に下位階層の人が所有する全てのレコードのフルアクセス権限を付与することができる。

### 共有ルール
組織図で言う横方向の共有設定。
![スクリーンショット 2022-12-01 21.22.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/449b0f24-31be-ae5d-31d6-1a1db98d835f.png)
オブジェクトごとにどのレコードを、誰に、どのくらいのアクセスレベルを持って共有するのかを設定することができる。
それぞれどんな内容が設定できるかというと
- どのレコードを
    - 「レコード所有者に基づく」か「条件に基づく」で指定できる
        - 例）商談の成立日が過去のレコードを
        - 例）ロールが営業第一メンバーに属する人が所有するレコードを
- 誰に
    - 「公開グループ」か「ロール」か「ロールおよび下位ロール」で指定できる
    - 【注意】ユーザとプロファイルでは指定できない
- どのくらいのアクセスレベル
    - 「参照のみ」か「参照/更新」で指定できる

ここまでの設定はシステム管理者が事前に設定画面から行っておくもので、最後の手動共有についてはユーザーが各々で設定することができる。

### 手動共有
レコードの共有ボタンから特定のレコードだけを指定したユーザーやグループに対して共有することができる。

# まとめ
- データへのアクセス権の種類は３つで上の方が権限として優位
    - オブジェクト権限
    - 項目レベルセキュリティ
    - レコードアクセス権
- レコードアクセス権を制御する共有設定は４つで、上を厳しくしておいて、下で権限を足す
    - 組織の共有設定
    - ロール設定
    - 共有ルール
    - 手動共有

# 最後に
いかがでしたか？私は初めSalesforceの権限設定を勉強した時、途中からわけがわからなくなりすぎで諦めました。が、やはり実際運用していく上では必ず正しく理解していなければならないので、これを機にきちんとまとめてきました。
多分これであってる気がするけど何度勉強してもあってるか不安になる権限設定。もし何か間違いがあったら教えてください。
明日はこの続きにもなりますが、権限セットとプロファイルをどう使い分けるかについて書いていこうと思います！