Memos About SalesForce

Salesforceにハマってたこと!

sfdc with sharing アクセス権

こんにちは、管理人の@Salesforce.Zです。

今回、また権限について、確認しました。

Salesforce SOQL APEX 権限はAPEX側でアクセス権限のチェックについて記載しましたが

今回、クラスレベルでアクセス権を切り替えることによって、どうなるかを検証したいと思います。

読んだら得ること

★ クラスレベルでのアクセス権を切替およびその結果

目次

非公開データモデルのアクセス権をAPEXクラスで見てみる

事前準備

  • 非公開のオブジェクトを用意する(取引先を使っても良い、カスタムオブジェクトを用意しても良い)

  • プロファイルが違うユーザは2つある  いずれも、非公開オブジェクトにアクセスができる、「すべて表示」権限はプロファイルでは、付与しない  参照・作成・削除くらいの権限があれば、検証できるです。

  • 片方のユーザで非公開のオブジェクトのデータを3件作成する(所有者はこのユーザになる)

  • クラスとVFページを用意し、リストビューと同じ感覚のページ

  • いずれのプロファイルにも用意したVFとクラスのアクセス権を付与、VFタブもどっちにも付与

  • 所有者ではないユーザで、用意したVFタブを押下し、所有者ではないユーザが見れるかを検証

簡単な検証するパターンを表にまとめたです。

f:id:jude2016:20190614112347p:plain
APEXアクセス権検証パターン

サンプルコントローラクラス

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>

検証オペレーション コントローラクラスと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で記述するだろう。