2019.10.08
セキュア、セキュア、実際セキュア。SecurityクラスstripInaccessibleメソッド!
こんにちは!
今回はWinter20にてついにパイロット版からベータ版に昇格を果たしたSecurityクラス、 stripInaccessibleメソッドの紹介をしていきたいと思います。
リリースノートを読み漁っているであろう皆様(或いはSWTTに参加された皆様)はご存じとは思いますが、 このメソッドの使用により項目レベルセキュリティを意識したapexの実装がより容易になります。 これまでは以下のような七面倒な実装を使用しなければチェックできなかった項目レベルセキュリティが、 わずか1行のコードで処理できるのです(別にチェック自体は1行でできたとか言わないで)
if(Schema.sObjectType.Account.fields.Name.isCreateable()||
Schema.sObjectType.Account.fields.Disapproval__c.isCreateable()||
Schema.sObjectType.Account.fields.Permission__c.isCreateable()){
System.debug('OK!');
}
さて肝心のstripInaccessibleメソッド、 引数はaccessCheckType(AccessType 列挙)とチェック対象のリスト。 見たほうが速いので以下のコードをご覧ください。
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());
}
}
実行ユーザの権限は、 Permission__c→参照・編集 Disapproval__c→参照 となっています。 結果は以下の通り。
編集権限(正確には作成の権限)がない項目が見事にはじかれているのが分かります。 さらに変更されたレコードのインデックス、変更された項目も取得可能。実際セキュア。 AppExchangeなどでは百億パーセントチェックされるセキュリティ要件を満たすのには必須なので、 是非とも押さえておきたい新機能でした。
では、オタッシャデー!