Salesforceのレコード権限を効率的に確認:Apexでの実装例


UserRecordAccess オブジェクトを使用してレコード編集権限を確認する方法

Apexでレコードに対するユーザーの編集権限を確認するためには、UserRecordAccess オブジェクトを活用するのが最適です。このオブジェクトは、特定のレコードに対する現在のユーザーのアクセス権を簡単に確認できる便利なツールです。


基本的なクエリ構文

  1. 単一レコードの編集権限を確認する場合:
SELECT RecordId, HasEditAccess 
FROM UserRecordAccess 
WHERE UserId = :UserInfo.getUserId() 
    AND RecordId = :recordId
  • RecordId:対象となるレコードのID。
  • HasEditAccess:現在のユーザーがレコードを編集できる場合は true、それ以外は false
  1. 複数レコードの編集権限をバッチで確認する場合:
List<Id> recordIds = new List<Id>{'a0123456789ABCDE', 'a1123456789FGHIJ', 'a2123456789KLMNO'};
List<UserRecordAccess> accessRecords = [
    SELECT RecordId, HasEditAccess 
    FROM UserRecordAccess 
    WHERE UserId = :UserInfo.getUserId() 
        AND RecordId IN :recordIds
];

for (UserRecordAccess ura : accessRecords) {
    System.debug('Record ID: ' + ura.RecordId + ', Can Edit: ' + ura.HasEditAccess);
}
  • recordIds:チェックしたいレコードのIDリスト(200件まで)。
  • HasEditAccess:各レコードに対する編集権限の有無を返します。

注意点

  1. 最大200件の制限
    UserRecordAccess を使用する際、1回のクエリで最大200件のレコードIDしか確認できません。この制限を超える場合は、バッチ処理などの工夫が必要です。

  2. リストの型
    RecordId IN :allRecordIds で渡すIDリストは必ず List 型で指定してください。Set 型ではエラーになります。

  3. 利用可能なフィールド

    • HasReadAccess:読み取り権限の有無
    • HasEditAccess:編集権限の有無
    • HasDeleteAccess:削除権限の有無
    • HasTransferAccess:移行権限の有無
    • HasAllAccess:すべての権限の有無

シナリオ:Visualforceページでの実装例

以下は、Visualforceページで複数のレコードに対して「編集」ボタンを動的に表示する例です。

Apexクラス

public with sharing class RecordAccessController {
    @AuraEnabled
    public static List<Wrapper> getRecordsWithAccess(List<Id> recordIds) {
        List<UserRecordAccess> accessList = [
            SELECT RecordId, HasEditAccess 
            FROM UserRecordAccess 
            WHERE UserId = :UserInfo.getUserId() 
                AND RecordId IN :recordIds
        ];

        Map<Id, Boolean> accessMap = new Map<Id, Boolean>();
        for (UserRecordAccess access : accessList) {
            accessMap.put(access.RecordId, access.HasEditAccess);
        }

        List<Wrapper> wrappers = new List<Wrapper>();
        for (Id recordId : recordIds) {
            wrappers.add(new Wrapper(recordId, accessMap.get(recordId)));
        }

        return wrappers;
    }

    public class Wrapper {
        @AuraEnabled public Id recordId;
        @AuraEnabled public Boolean canEdit;

        public Wrapper(Id recordId, Boolean canEdit) {
            this.recordId = recordId;
            this.canEdit = canEdit;
        }
    }
}

Visualforceページ

<apex:page controller="RecordAccessController" id="page">
    <apex:form>
        <apex:repeat value="{!records}" var="record">
            <div>
                Record ID: {!record.recordId}
                <apex:commandButton action="{!editAction}" value="Edit" rendered="{!record.canEdit}" />
            </div>
        </apex:repeat>
    </apex:form>
</apex:page>

まとめ

UserRecordAccess オブジェクトを使用すれば、特定ユーザーのレコード権限を簡単にチェックでき、クエリの制限を考慮しつつ効率的に権限管理を行うことが可能です。VisualforceページやLightning Web Componentsでの活用にも適しています。

コメント