AccessLevel クラス
名前空間
使用方法
デフォルトでは、Apex コードはシステムモードで実行されます。つまり、コードを実行しているユーザーよりも非常に上位の権限で実行されます。システムモードでは、現在のユーザーのオブジェクト権限と項目レベル権限が無視され、クラスの sharing キーワードでレコード共有ルールが制御されます。ユーザーモードでは、現在のユーザーのオブジェクト権限、項目レベルのセキュリティ、および共有ルールが適用されます。
System.Database および System.Search クラスの DML メソッドの多くには、実行モードを指定する accessLevel パラメーターが含まれています。
例
この Apex コードを実行するユーザーに Account オブジェクトへの更新アクセス権がない場合、Database.insert() メソッドはエラーを返します。
1List<Account> toInsert = new List<Account>{new Account(Name = 'Exciting New Account')};
2
3List<Database.SaveResult> sr = Database.insert(toInsert, AccessLevel.USER_MODE);
4一方、次の例は、システムモードで実行するメソッドを示しています。挿入が成功するかどうかは、Apex コードを実行するユーザーに Account オブジェクトへの作成アクセス権があるかどうかによりません。
1List<Account> toInsert = new List<Account>{new Account(Name = 'Exciting New Account')};
2
3List<Database.SaveResult> sr = Database.insert(toInsert, AccessLevel.SYSTEM_MODE);
4AccessLevel のメソッド
AccessLevel のメソッドは次のとおりです。
withPermissionSetId(permissionSetId) (開発者プレビュー)
この機能は、ApexUserModeWithPermset 機能が有効になっているスクラッチ組織で使用できます。この機能が有効になっていない場合、この機能を含む Apex コードは、コンパイルすることはできても、実行することはできません。
署名
public System.AccessLevel withPermissionSetId(String permissionSetId)
パラメーター
- permissionSetId
- 型: String
- ユーザーモード DML 操作の実行中は、実行中のユーザーの権限に加え、指定された権限セット内の権限が適用されます。
戻り値
型: アクセスレベルクラス
例
1@isTest
2public with sharing class ElevateUserModeOperations_Test {
3 @isTest
4 static void objectCreatePermViaPermissionSet() {
5 Profile p = [SELECT Id FROM Profile WHERE Name='Minimum Access - Salesforce'];
6 User u = new User(Alias = 'standt', Email='standarduser@testorg.com',
7 EmailEncodingKey='UTF-8', LastName='Testing', LanguageLocaleKey='en_US',
8 LocaleSidKey='en_US', ProfileId = p.Id,
9 TimeZoneSidKey='America/Los_Angeles',
10 UserName='standarduser' + DateTime.now().getTime() + '@testorg.com');
11
12 System.runAs(u) {
13 try {
14 Database.insert(new Account(name='foo'), AccessLevel.User_mode);
15 Assert.fail();
16 } catch (SecurityException ex) {
17 Assert.isTrue(ex.getMessage().contains('Account'));
18 }
19 //Get ID of previously created permission set named 'AllowCreateToAccount'
20 Id permissionSetId = [Select Id from PermissionSet
21 where Name = 'AllowCreateToAccount' limit 1].Id;
22
23 Database.insert(new Account(name='foo'), AccessLevel.User_mode.withPermissionSetId(permissionSetId));
24
25 // The elevated access level in not persisted to subsequent operations
26 try {
27 Database.insert(new Account(name='foo2'), AccessLevel.User_mode);
28 Assert.fail();
29 } catch (SecurityException ex) {
30 Assert.isTrue(ex.getMessage().contains('Account'));
31 }
32
33 }
34 }
35}
36AccessLevel のプロパティ
AccessLevel のプロパティは次のとおりです。
SYSTEM_MODE
署名
public System.AccessLevel SYSTEM_MODE {get;}
プロパティ値
型: System.AccessLevel