CRUD および項目レベルセキュリティ (FLS)
Lightning コンポーネントでは、オブジェクトを参照したり、Apex コントローラからオブジェクトを取得したりするときに、CRUD および FLS が自動的に適用されることはありません。つまり、このフレームワークでは、ユーザに CRUD アクセス権および FLS 表示権限がないレコードと項目は引き続き表示されます。CRUD と FLS は、Apex コントローラで手動によって適用する必要があります。
たとえば、with sharing キーワードを Apex コントローラに含めることで、ユーザには Lightning コンポーネントでアクセス権を持つレコードのみが表示されます。さらに、レコードまたはオブジェクトに対する操作を実行する前に、isAccessible()、isCreateable()、isDeletable()、isUpdateable() があることを明示的にチェックする必要があります。
次の例は、カスタム経費オブジェクトに対する推奨される操作実行方法を示します。
1public with sharing class ExpenseController {
2
3 // ns refers to namespace; leave out ns__ if not needed
4 // This method is vulnerable.
5 @AuraEnabled
6 public static List<ns__Expense__c> get_UNSAFE_Expenses() {
7 return [SELECT Id, Name, ns__Amount__c, ns__Client__c, ns__Date__c,
8 ns__Reimbursed__c, CreatedDate FROM ns__Expense__c];
9 }
10
11 // This method is recommended.
12 @AuraEnabled
13 public static List<ns__Expense__c> getExpenses() {
14 String [] expenseAccessFields = new String [] {'Id',
15 'Name',
16 'ns__Amount__c',
17 'ns__Client__c',
18 'ns__Date__c',
19 'ns__Reimbursed__c',
20 'CreatedDate'
21 };
22
23
24 // Obtain the field name/token map for the Expense object
25 Map<String,Schema.SObjectField> m = Schema.SObjectType.ns__Expense__c.fields.getMap();
26
27 for (String fieldToCheck : expenseAccessFields) {
28
29 // Check if the user has access to view field
30 if (!m.get(fieldToCheck).getDescribe().isAccessible()) {
31
32 // Pass error to client
33 throw new System.NoAccessException();
34
35 // Suppress editor logs
36 return null;
37 }
38 }
39
40 // Query the object safely
41 return [SELECT Id, Name, ns__Amount__c, ns__Client__c, ns__Date__c,
42 ns__Reimbursed__c, CreatedDate FROM ns__Expense__c];
43 }
44}