こんにちは、管理人の@Salesforce.Zです。
今回、また権限について、確認しました。
Salesforce SOQL APEX 権限はAPEX側でアクセス権限のチェックについて記載しましたが
今回、クラスレベルでアクセス権を切り替えることによって、どうなるかを検証したいと思います。
★ クラスレベルでのアクセス権を切替およびその結果
目次
非公開データモデルのアクセス権をAPEXクラスで見てみる
事前準備
非公開のオブジェクトを用意する(取引先を使っても良い、カスタムオブジェクトを用意しても良い)
プロファイルが違うユーザは2つある いずれも、非公開オブジェクトにアクセスができる、「すべて表示」権限はプロファイルでは、付与しない 参照・作成・削除くらいの権限があれば、検証できるです。
片方のユーザで非公開のオブジェクトのデータを3件作成する(所有者はこのユーザになる)
クラスとVFページを用意し、リストビューと同じ感覚のページ
いずれのプロファイルにも用意したVFとクラスのアクセス権を付与、VFタブもどっちにも付与
所有者ではないユーザで、用意したVFタブを押下し、所有者ではないユーザが見れるかを検証
簡単な検証するパターンを表にまとめたです。
サンプルコントローラクラス
public class PermmisionConfirmCtrl { public List<TestObj01__c> testobjList {get;set;} public PermmisionConfirmCtrl(){ testobjList = TestDao.testQuery(); } }
サンプルDAOクラス
public class TestDao { public static List<TestObj01__c> testQuery(){ List<TestObj01__c> testobjList = [select Id, Name, Division__c,TestField01__c from TestObj01__c]; return testobjList; } }
サンプルVFページ
<apex:page controller="PermmisionConfirmCtrl"> <apex:form> <apex:pageblock> <apex:pageBlockSection> <apex:pageBlockTable value="{!testobjList}" var="data"> <apex:column value="{!data.Name}"/> <apex:column value="{!data.Division__c}"/> <apex:column value="{!data.TestField01__c}"/> </apex:pageBlockTable> </apex:pageBlockSection> </apex:pageblock> </apex:form> </apex:page>
検証オペレーション2> コントローラクラスとDAOクラスの with sharing 、without sharingはパターンごとに変える必要がある
結果も表にまとめたです。
結論
元クラスから コール先のクラスをコールする際に
元クラスはwith sharing だろうが、without sharing だろうが コール先のクラスのwith or withoutに従うです。
最後実施するクラスの共有ルールに従うともいえるでしょう
ただし、元クラスもコール先クラスも記述しない場合、システム管理者で実施するです。
リファレンス
with sharing、without sharing、および inherited sharing キーワードの使用SFDC:『with sharing』と『without sharing』の切り替えによるアクセス権の変化
基本、コントローラクラスはwith sharingで記述するだろう。