オブジェクト権限と項目権限の適用
Apex は一般に、システムコンテキストで実行されます。つまり、コード実行時に、現在のユーザの権限および項目レベルセキュリティは考慮されません。ただし、共有ルールは必ずスキップされるわけではありません。共有ルールが適用されないようにするには、必ず without sharing キーワードを使用してクラスを宣言する必要があります。executeAnonymous コールで実行された Apex コードと Connect in Apex は、常に現在のユーザの共有ルールを使用して実行されます。executeAnonymous の詳細は、「匿名ブロック」を参照してください。
実行ユーザの項目レベルセキュリティ (FLS) とオブジェクト権限を適用するには、データベース操作のユーザモードアクセスを指定します。「ユーザモードでのデータベース操作」を参照してください。これらの権限は、WITH SECURITY_ENFORCED を使用して SOQL クエリで適用することもできます。詳細は、「WITH SECURITY_ENFORCED を使用した SOQL クエリの絞り込み」を参照してください。
また、現在のユーザのアクセス権限レベルを確認する (Schema.DescribeSObjectResult の) sObject describe result メソッドおよび (Schema.DescribeFieldResult の) field describe result メソッドを明示的にコールすることにより、コードでオブジェクトレベルおよび項目レベルの権限を適用することもできます。この方法では、現在のユーザに必要な権限があるかどうかを確認し、ユーザに十分な権限がある場合に限り、特定の DML 操作またはクエリを実行できます。
たとえば、Schema.DescribeSObjectResult の isAccessible, isCreateable メソッドまたは isUpdateable メソッドを呼び出すことにより、現在のユーザに sObject に対する参照、作成または更新のアクセス権があるかどうかをそれぞれ確認できます。同様に、Schema.DescribeFieldResult では、現在のユーザの項目に対する参照、作成または更新アクセス権を確認するためにコールできるこれらのアクセス制御メソッドを公開します。また、Schema.DescribeSObjectResult が提供する isDeletable メソッドをコールすることにより、現在のユーザに特定の sObject を削除する権限があるかどうかを確認できます。
アクセス制御メソッドをコールする例を次に示します。
共有ルールはオブジェクトレベルの権限および項目レベルの権限とは異なります。これら両方を設定することができます。共有ルールが Salesforce で定義されている場合、with sharing キーワードを使用してクラスを宣言することにより、クラスレベルで共有ルールを適用できます。詳細は、「with sharing、without sharing、および inherited sharing キーワードの使用」を参照してください。sObject describe result および field describe result アクセス制御メソッドをコールする場合、オブジェクトおよび項目レベルの権限の確認は、有効な共有ルールに追加して実行されます。共有ルールにより付与されるアクセスレベルがオブジェクトレベルの権限または項目レベルの権限と競合する場合があります。
考慮事項
- Experience Cloud サイトが有効化されている組織では、ユーザの個人情報を他のユーザに非表示にするさまざまな設定が提供されます (「外部ユーザへの個人ユーザ情報の非表示」および「Experience Cloud サイト内での個人連絡先情報の共有」を参照)。これらの設定は、WITH SECURITY_ENFORCED 句や stripInaccessible メソッドなどのセキュリティ機能があっても、Apex では適用されません。Apex のユーザオブジェクトで特定の項目を非表示にするには、「ユーザの個人情報表示設定への準拠」に記載されているコード例に従ってください。
- 自動化プロセスユーザは、適切な権限セットが明示的に適用されていない限り、カスタムコードでオブジェクトと FLS のチェックを実行できません。