Technology

Saleforce 実行権限 トリガ クラス

投稿日:

こんにちは、管理人の@Salesforce.Zです。
普段、 Apex はシステムコンテキストで実行されます。つまり、コード実行時に、現在のユーザの権限、項目レベルセキュリティ、および共有ルールは考慮されません。
もちろん、特例があります。 それは、コンソール匿名(executeAnonymous )コールおよび Chatter in Apex と共に実行される Apex コードです。 コンソール匿名 executeAnonymous は常に、現在のユーザのフル権限を用いて実行されます 。

ちょい説明

【Apex】with sharingキーワードとwithout sharingキーワード

クラスで with sharing または without sharing キーワードを使用して、共有ルールを適用するかどうかを指定できます。

with sharing例(ユーザモードで実行)

without sharing例(システムモードで実行)

トリガ (システムモードで実行)

拡張説明(クラスの継承)

メソッドがコールされるクラスの共有設定ではなく、メソッドが定義されているクラスの共有設定が適用されます。たとえば、with sharing が宣言されたクラス内に定義されているメソッドが、without sharing が宣言されたクラスでコールされる場合、そのメソッドの実行では共有ルールが適用されます 。
下記の親クラス外部子クラスのように、親クラスcallOtherClassMethodメソッドは
ユーザモードで実行されること。子クラスがシステムモードのクラスにもかかわらず。

with sharing および without sharing キーワードに関する実装の詳細

公式サイトにも記載してあるがリンクが変更される可能性もあるため、ここに引用させていただきます。結構重要なので、使いこなしたら、すごい良いと思います。

1.メソッドがコールされるクラスの共有設定ではなく、メソッドが定義されているクラスの共有設定が適用されます。たとえば、with sharing
 が宣言されたクラス内に定義されているメソッドが、without sharing
 が宣言されたクラスでコールされる場合、そのメソッドの実行では共有ルールが適用されます。
2.with sharing も without sharing もクラスで宣言されていない場合、現在の共有ルールが有効となります。そのため、クラスが別のクラスから共有ルールを取得する場合を除き、共有ルールは強制実行されません。たとえば、共有が強制実行されている別のクラスからクラスがコールされた場合、コールされたクラスにも共有が強制実行されます。
3.内部クラスと外部クラスは、どちらも with sharing
 として宣言できます。共有設定は、初期化コード、コンストラクタ、メソッドなどクラスに含まれているすべてのコードに適用されます。
4.内部クラスはそのコンテナクラスから共有設定を継承しません
5.クラスが別のクラスを拡張または実装している場合、親クラスからこの設定が継承されます。

Salesforce公式ドキュメント(ヘルプ)
with sharing、without sharing、および inherited sharing キーワードの使用

【Apex】オブジェクト権限と項目権限

ここから、APEXでCRUD操作をする前に関連する項目に対して、権限を確認し、
権限がある場合のみ、関連CRUD操作を行うようにする、きっと変なエラーにならないでしょう。システム正式運用時にたまに、予想外のエラーがシステム管理者に届き、
見ても想像がつかない。調査すると、権限のないユーザで、トリガや機能を発火して、発生したとか、業務上では、あり得ないだけど、業務をする人ではない場合、めっちゃくちゃのリレーションを結ぶし、変更するし、常識ではないデータも作る。こんなケースは少なくない、よって、予想外なエラーがきっとどこかで、発生するでしょう。普通はCRUDを実施するところにはtry catchブロックはもちろんん、Savepointや権限確認もやるべきかと思っています。

現在のユーザに sObject に対する参照、作成または更新のアクセス権があるかどうかをそれぞれ確認するには、Schema.DescribeSObjectResult の isAccessible, isCreateable メソッドまたは isUpdateable メソッドを呼び出すことにより 可能です。

APEXで更新する前に項目の更新権限確認例

APEXで作成する前に項目の作成権限確認例

APEXで参照する前に項目の参照権限確認例

APEXで削除する前に オブジェクトレベルの削除権限確認例

実行パターンと実行権限まとめ

検証結果

簡単説明

計9回検証しました。

#1~#9まではいずれもメインクラスがあり、中からDAOクラスをコール、DAOのクエリ結果を確認する方法です。

システム管理者列はシステム管理者で、データを用意する意味

前提条件は取引先の共有設定は

非公開

になっていること

#1検証

上記のmainClassをシステム管理者で、3件データを用意した上で
・システム管理者で、実行する結果が3件を見つかりました。
・別ユーザで、実行する結果が0件

#2~#9まで、同じようにメインクラスとDAOクラスで、with sharing とwithout sharingで組み合わせて、システム管理者と別ユーザで、クラスを実行し、見つかったデータ件数を検証する方法で、結果を表にまとめました。

この記事の上半部分に引用部分に対して、検証した結果。そして表にしたものです。
たいしたことではありませんが、やってみると印象が深い

終わりに

Apex実行するには本当にオブジェクトレベル、レコードレベル、項目レベルで考慮を厳密に行うと大変です。そんなリーダーも少ないはず。なんとか納期に間に合えば、もう立派と見られる時期です。

お客様がこの部分を業務上で、しっかりするので、そんなに合わないじゃないかと思います。お客様が仕事の真面目さで、ITがある程度、この部分をすこしさぼれるが、違う国のお客様だと、本当にでたらめなことをしあがってくれるのです。業務上ではありえないことをだれか、そのように動かす可能性が十分ある。

経理なのに、○○機能を動かすと、きっとエラーやろう
工事の人なのに、経理機能を動かすと、きっとエラーやろう
ただしいユーザで、動いてくれませんかといいたいけど、UATなのでそんな適切な方がなかなか来れなくて …💦
※本気でUATじゃないよね

-Technology
-,

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

【FSL】 作業指示 作業指示明細 サービス予定の関係

こんにちは、管理人の@Salesforce.Zです。 Contents1 作業指示とサービス予定2 作業指示に対する、作業指示明細とサービス予定 作業指示とサービス予定 通常では、作業指示(WorkO …

Salesforce2Slack Integration インテグレーション シンプル

IT業界では、インテグレーションをすれば、いろいろな製品をつながって、弱点やできないことを補うことができる、良いところですね。今回、Slackの投稿をSalesforceから操作したいので、関連設定や …

【攻撃実例】 wordpress管理者へ セキュリティをしっかりしよう

サイトに症状がなくても、あなたのサイトにもう既にウィルス感染しているかもしれません。サーバーのファイルをひたすらみてみてください。おかしいファイルありませんか。稼いでるサイトの裏に実はウィルスファイルが置かれていることが別のケース対応で、ついでに発見したことがあります。

Salesforce データセキュリティ プロファイル 共有設定 ロール

こんにちは、管理人の@Salesforce.Zです。Salesforceのセキュリティ体制がきちんと整えている、セキュリティも、大手企業はSalesforce製品を導入する理由の一つです。ここに来た方 …

【保存版】SFDC SFS FSL field service フィールドサービス EXAM 資格問題110問

こんにちは、管理人の@Salesforce.Zです。 私も2014年から長年かけてSalesforceをやってきて(略称:SFDC)、Salesforce関連のノウハウや技術者などを中心としたブログも …