stripInaccessible メソッドによるセキュリティの適用
項目およびオブジェクトレベルのデータ保護には、Security および SObjectAccessDecision クラスを介してアクセスします。アクセスの検査は、作成、参照、更新、または更新/挿入という指定された操作のコンテキストで、現在のユーザーの項目レベルの権限に基づいて行われます。Security.stripInaccessible() メソッドは、ソースレコードに現在のユーザーの項目レベルセキュリティチェックに失敗した項目がないか確認します。また、このメソッドは、現在のユーザーがアクセスできない参照項目や主従関係項目のソースレコードをチェックします。このメソッドによって、sObjects の戻りリストが作成されます。これは、現在のユーザーがアクセスできない項目が除外されている以外は、ソースレコードと同じです。getRecords メソッドによって返される sObject には、stripInaccessible メソッドの sourceRecords パラメーター内の sObject と同じ順序でレコードが含まれています。
開発者プレビューの機能である Security.stripInaccessible() は、権限セット ID をパラメーターとして取得し、指定された権限セットと実行中のユーザーの権限に従って項目レベルおよびオブジェクトレベルのアクセス権を適用します。
削除されたアクセスできない項目を特定するには、SObject.isSet() メソッドを使用できます。たとえば、戻りリストには取引先責任者オブジェクトが含まれており、カスタム項目 social_security_number__c はユーザーからアクセスできません。このカスタム項目は、項目レベルのアクセスチェックに失敗するため、項目が設定されず、isSet は false を返します。
1SObjectAccessDecision securityDecision = Security.stripInaccessible(AccessType.READABLE, sourceRecords);
2Contact c = securityDecision.getRecords()[0];
3System.debug(c.isSet('social_security_number__c')); // prints "false"ユーザーオブジェクトでオブジェクト権限と項目権限を適用し、Experience Cloud サイトが含まれる組織でユーザーの個人情報を他のユーザーに非表示にするには、「オブジェクト権限と項目権限の適用」を参照してください。
stripInaccessible メソッドを使用可能ないくつかの例を次に示します。
例
1SObjectAccessDecision securityDecision =
2 Security.stripInaccessible(AccessType.READABLE,
3 [SELECT Name, BudgetedCost, ActualCost FROM Campaign] );
4
5 // Construct the output table
6 if (securityDecision.getRemovedFields().get('Campaign').contains('ActualCost')) {
7 for (Campaign c : securityDecision.getRecords()) {
8 //System.debug Output: Name, BudgetedCost
9 }
10 } else {
11 for (Campaign c : securityDecision.getRecords()) {
12 //System.debug Output: Name, BudgetedCost, ActualCost
13 }
14}例
1List<Account> accountsWithContacts =
2 [SELECT Id, Name, Phone,
3 (SELECT Id, LastName, Phone FROM Account.Contacts)
4 FROM Account];
5
6 // Strip fields that are not readable
7 SObjectAccessDecision decision = Security.stripInaccessible(
8 AccessType.READABLE,
9 accountsWithContacts);
10
11// Print stripped records
12 for (Integer i = 0; i < accountsWithContacts.size(); i++)
13 {
14 System.debug('Insecure record access: '+accountsWithContacts[i]);
15 System.debug('Secure record access: '+decision.getRecords()[i]);
16 }
17
18// Print modified indexes
19 System.debug('Records modified by stripInaccessible: '+decision.getModifiedIndexes());
20
21// Print removed fields
22 System.debug('Fields removed by stripInaccessible: '+decision.getRemovedFields());例
1List<Account> newAccounts = new List<Account>();
2Account a = new Account(Name='Acme Corporation');
3Account b = new Account(Name='Blaze Comics', Rating=’Warm’);
4newAccounts.add(a);
5newAccounts.add(b);
6
7SObjectAccessDecision securityDecision = Security.stripInaccessible(
8 AccessType.CREATABLE, newAccounts);
9
10// No exceptions are thrown and no rating is set
11insert securityDecision.getRecords();
12
13System.debug(securityDecision.getRemovedFields().get('Account')); // Prints "Rating"
14System.debug(securityDecision.getModifiedIndexes()); // Prints "1"例
1String jsonInput =
2'[' +
3'{' +
4'"Name": "InGen",' +
5'"AnnualRevenue": "100"' +
6'},' +
7'{' +
8'"Name": "Octan"' +
9'}' +
10']';
11
12List<Account> accounts = (List<Account>)JSON.deserializeStrict(jsonInput, List<Account>.class);
13SObjectAccessDecision securityDecision = Security.stripInaccessible(
14 AccessType.UPDATABLE, accounts);
15
16// Secure update
17update securityDecision.getRecords(); // Doesn’t update AnnualRevenue field
18System.debug(String.join(securityDecision.getRemovedFields().get('Account'), ', ')); // Prints "AnnualRevenue"
19System.debug(String.join(securityDecision.getModifiedIndexes(), ', ')); // Prints "0”例
1// Account__c is a lookup from MyCustomObject__c to Account
2@IsTest
3 public class TestCustomObjectLookupStripped {
4 @IsTest static void caseCustomObjectStripped() {
5 Account a = new Account(Name='foo');
6 insert a;
7 List<MyCustomObject__c> records = new List<MyCustomObject__c>{
8 new MyCustomObject__c(Name='Custom0', Account__c=a.id)
9 };
10 insert records;
11 records = [SELECT Id, Account__c FROM MyCustomObject__c];
12 SObjectAccessDecision securityDecision = Security.stripInaccessible
13 (AccessType.READABLE, records);
14
15 // Verify stripped records
16 System.assertEquals(1, securityDecision.getRecords().size());
17 for (SObject strippedRecord : securityDecision.getRecords()) {
18 System.debug('Id should be set as Id fields are ignored: ' +
19 strippedRecord.isSet('Id')); // prints true
20 System.debug('Lookup field FLS is not READABLE to running user,
21 should not be set: ' +
22 strippedRecord.isSet('Account__c')); // prints false
23 }
24 }
25 }