blog
ブログ

Salesforce技術ブログ(セキュア、セキュア、実際セキュア。stripInaccessibleメソッド)②

いよいよ冬の当落も出て冬らしい忙しさが本格化する頃ですがいかがお過ごしでしょうか?
ドーモ、皆さん。ルルイエフクシゲです。
さて今回は、前回に紹介したstripInaccessibleメソッド、その補足記事になります。
前回は単一のオブジェクトに対する項目レベルセキュリティチェックでしたが、
何とこのメソッド、複数オブジェクトにも対応しているのです(ナ、ナンダッテー
今回はその内容を検証してみましょう。

 

ここで取り出したるは前回記事のコード。

public class TestCreateController {
    public Account testAccount{get;set;}

    public 	TestCreateController(){
        testAccount = new Account();
    }
    
    public void save(){
        //編集権限のない項目を設定する
        testAccount.Disapproval__c  = 'Disapproval';
        System.debug('処理前: '+testAccount);
        
        List accountList = new List{testAccount};
            
        //項目レベルセキュリティの適用    
	SObjectAccessDecision decision = Security.stripInaccessible(AccessType.CREATABLE, accountList);

	//処理結果の確認
	for(Integer i = 0; i < accountList.size(); i++){
    		System.debug('処理結果: '+decision.getRecords()[i]);
	}
        System.debug('変更されたインデックス: '+decision.getModifiedIndexes());
    	System.debug('変更されたフィールド: '+decision.getRemovedFields());
    }
}
これを、こうします。

 


public class TestCreateController {
    public Account testAccount{get;set;}
    public Contact testContact{get;set;}

    public 	TestCreateController(){
        testAccount = new Account();
        testContact = new Contact();
    }
    
    public void save(){
        //編集権限のない項目を設定する
        testAccount.Disapproval__c  = 'Disapproval';
        testContact.Disapproval__c  = 'Disapproval';
        System.debug('処理前: '+testAccount);
        System.debug('処理前: '+testContact);
        
        List objList = new List{testAccount, testContact};
            
        //項目レベルセキュリティの適用    
		SObjectAccessDecision decision = Security.stripInaccessible(AccessType.CREATABLE, objList);

		//処理結果の確認
		for(Integer i = 0; i < objList.size(); i++){
    		System.debug('処理結果: '+decision.getRecords()[i].isSet('Disapproval__c'));
		}
        System.debug('変更されたインデックス: '+decision.getModifiedIndexes());
    	System.debug('変更されたフィールド: '+decision.getRemovedFields());
    }
}
今回の権限は前回にちょい足しして以下の通り
オブジェクト 項目 権限
Account Disapproval__c 権限なし
Contact Disapproval__c 権限なし

これを実行してみますと、以下のような結果に

(ここまで読んだ方の中にisSet()が唐突に登場して混乱をきたしている方もいるかもしれませんので
念のために補足しておきます)
isSetメソッドは項目に対して値が設定されているかを検証するメソッドです。
項目に対して書き込みが行われていた場合(nullを設定した場合でも)trueを、書き込みがなければfalseを返します。
今回はstripInaccessibleメソッドによって書き込みそのものがなかったことになっているのが見て取れます。
ワザマエ!
前回の内容と併せて使ってみると、複数のオブジェクトに対して1メソッドで項目レベルセキュリティの検証が
行える超便利メソッドということがわかります。
セキュリティを意識するうえで欠かせないこのメソッド、
ぜひ活用してみてください。
では、オタッシャデー!
contact

ご相談・ご質問等ございましたら、お気軽にお問い合わせください。

翻訳