オブジェクト権限と項目権限の適用
Apex は一般に、システムコンテキストで実行されます。つまり、コード実行時に、現在のユーザの権限および項目レベルセキュリティは考慮されません。ただし、共有ルールは必ずスキップされるわけではありません。共有ルールを適用させないためには、必ず without sharing キーワードを使用してクラスを宣言する必要があります。executeAnonymous コールで実行された Apex コードと Connect in Apex は、常に現在のユーザの共有ルールを使用して実行されます。executeAnonymous の詳細は、「匿名ブロック」を参照してください。
Apex は、デフォルトでは、オブジェクトレベルおよび項目レベルの権限を適用しませんが、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 を削除する権限があるかどうかを確認できます。
次に、アクセス制御メソッドをコールする方法の例を示します。
1if (Schema.sObjectType.Contact.fields.Email.isUpdateable()) {
2 // Update contact phone number
3}1if (Schema.sObjectType.Contact.fields.Email.isCreateable()) {
2 // Create new contact
3}1if (Schema.sObjectType.Contact.fields.Email.isAccessible()) {
2 Contact c = [SELECT Email FROM Contact WHERE Id= :Id];
3}1if (Schema.sObjectType.Contact.isDeletable()) {
2 // Delete contact
3}共有ルールはオブジェクトレベルの権限および項目レベルの権限とは異なります。これら両方を設定することができます。共有ルールが Salesforce で定義されている場合、with sharing キーワードを使用してクラスを宣言することにより、クラスレベルで共有ルールを適用できます。詳細は、「with sharing、without sharing、および inherited sharing キーワードの使用」を参照してください。sObject describe result および field describe result アクセス制御メソッドをコールする場合、オブジェクトおよび項目レベルの権限の確認は、有効な共有ルールに追加して実行されます。共有ルールにより付与されるアクセスレベルがオブジェクトレベルの権限または項目レベルの権限と競合する場合があります。