2017.08.18

Salesforce設計(案) Case.機密保持情報をどう取り扱うか

  • このエントリーをはてなブックマークに追加
  • follow us in feedly

はじめに

「Salesforce設計(案) Case.機密保持情報をどう取り扱うか」 と題して、 Salesforceを活用するユーザの方向けに、どう構築すべきか考えてみました。

■業務要件

要件1:【プロジェクト情報】の共有範囲は、データ所有者が所属する支店内のみとしたい。

要件2:機密保持契約を締結したプロジェクトは、それまでの共有範囲に関係なく、担当者以外に公開させない。

要件3:レポートによる各種集計では、機密保持対応で参照できないレコードの数値も対象にしたい。

■前提

・顧客と締結したプロジェクト関連のデータを「プロジェクト情報」オブジェクトに格納する。(以下【プロジェクト情報】)
・機密保持対象の内容(項目)が【プロジェクト情報】にある。
・機密保持契約を締結した後に対応できるよう【プロジェクト情報】に「機密保持対応」項目を用意する。
この項目がON(=True)で保存されたら、データ所有者以外は参照できないものとする。
・プロジェクト担当者は、当該【プロジェクト情報】レコードの所有者とする。

どう実現するか?要件1

要件1:【プロジェクト情報】の共有範囲は、新規登録時、作成者が所属する支店内のみとしたい。

本件の実現は、いわゆる「非公開で共有」の標準設定で対応できます。
・「組織の共有設定」にて【プロジェクト情報】を非公開にする。
・「共有ルール」にて、所有者の所属する支店内で共有するルールを、各支店分作成する。
「共有設定」で一度閉じて「共有ルール」で個別に開けて行く方法です。

「共有設定」画面(組織の共有設定)

キャプチャの通り、オブジェクトごとに設定します。 ※階層を使用したアクセス許可(キャプチャの右側の設定) ロールの基本原則である「上位ロールのユーザは、下位ロールのユーザが所有するレコードに対してアクセスできる」を実現している設定。 要件1.だけの実現であればON(デフォルト値)のままで問題ない。

「共有ルール」画面

「沖縄営業所に所属するユーザが所有する【プロジェクト情報】レコードは、沖縄営業所に所属するユーザ全員に参照のみで共有する」 という個別の共有ルールです。 これを、支店分設定すれば、後は自動でデータ共有が図られます。

どう実現するか?要件2

要件2:機密保持契約を締結したプロジェクトは、それまでの共有範囲に関係なく、担当者以外に公開させない。

本件の実現イメージは、前提に記載の通り、
・機密保持契約を締結した後に対応できるよう【プロジェクト情報】に「機密保持対応」項目を用意する。
・「機密保持対応」項目がON(=True)で保存されたら、データ所有者以外は参照できないものとする。
である。

これは、標準機能では実現できないため、個別開発プログラム(以下、Apex)を用意して実現する。
動きとしては、
・【プロジェクト情報】の登録または更新時に「機密保持対応」がOFF→ONに変更されたかをチェックして、
これを検知した場合は、当該【プロジェクト情報】の共有レコードをすべて削除する。(所有者以外)
が実装できれば良い。

そして、もう1つ。
・共有設定の「階層を使用したアクセス許可」=OFF
これがONだと、上位ロールのユーザから参照できてしまうためOFFにする。

※共有レコードとは:1レコードごとに、参照または編集権限を持っているユーザ、ロール、グループが定義されたレコード
※共有レコードをすべて削除:レコードの所有者はApexからでも削除できない仕様のため、ちょうど良い。

だが・・・

「共有ルール」で定義したルールに基づいて、Salesforceが自動作成した共有レコードは、Apexからでも取り扱えないため削除できない。

よって、要件2.の実現のためには、
要件1.で書いた「共有ルール」を破棄して、同ルールをApexで実装する必要がある。
これで実現できる。

※Apexや手動で作成した共有レコードは、Apexから削除できる。

補足

まず、データアクセスのベース、とりわけ各オブジェクトに対する基本アクセス権「CRUD(作成、参照、更新、削除)」は、プロファイルでの設定を検討します。
次に、1つのレコードに対しては、共有設定と共有ルールでの制御を検討します。

#プロファイル
オブジェクトに対する基本アクセス「CRUD(作成、参照、更新、削除)」や各機能の実行権限を定義して、ユーザに割り当てる機能です。(例:システム管理者、特権ユーザ、一般ユーザなど)
本ケースでは【プロファイル情報】へのCRUD権が付与されているものとします。

#組織の共有設定
各オブジェクトに対する基本アクセス権を設定します。

#共有ルール
・組織の共有設定に対する例外を表します。
・組織の共有設定より厳しくすることはできません。
・特定のユーザにより強いアクセス権を許可することのみ可能です。
・レコードがある条件を満たした場合、自動的に共有(アクセス権限の付与)を行うことが出来る機能です。

「非公開で共有」とは、
「共有設定」で非公開に設定して1度閉じる。
「共有ルール」にて、必要な共有条件を、1つ1つ設定して開けて行くことを表現しています。

#機密保持対応をON→OFFにした場合
・上記の仕様の場合、機密保持をOFFに戻しても、共有範囲が維持されたままで、元の設定(支店内共有)になりません。それを実現するApexを別途用意する必要があります。

#レコードの所有者が変更された場合
・手動にて設定した共有レコードは削除されます。
・Apexにて設定した共有レコードは維持されます。

#関連するオブジェクトの見え方について
・参照関係にあるオブジェクトの場合は、各オブジェクトごとに制御が必要です。
例えば、【プロジェクト情報】に参照関係で紐付く【見積】があったとした場合。
【見積】の共有設定が「公開」であれば、全公開のため、誰でも参照できます。
そうではなく、参照権限のある【プロジェクト情報】に紐付く【見積】だけを参照させたい場合には、【プロジェクト情報】と同じ設定、制御が、【見積】にも必要になります。
共有設定を非公開にして、【プロジェクト情報】のApex処理時に、紐付く【見積】にも同様の処理を施すといったことが必要になります。
・主従関係あるオブジェクトの場合は、子オブジェクトへのアクセス権は、親オブジェクトのアクセス権に従います。
例えば、【プロジェクト情報】に主従関係で紐付く【見積】があったとした場合。
アクセス権が完全に継承されるため、【見積】への制御は不要になります。
が、【見積】単独でのアクセス権の付与は出来なくなります。

さいごに

駆け足のような説明になりますしたが、ご理解頂けたでしょうか?
他の適切な方法があれば、コメントにてご質問ご指摘ください。

要件3.の実現案は、次回執筆したいと思います。
18 件

関連する記事