目的

CRUD および項目レベルセキュリティ (FLS) 権限チェック Util を作成方法を共有します

ソース

public with sharing class FLSUtil {
    //環境の接頭辞
    private static final String ENV_PREFIX = getPrefix();
    //アンダーバーC
    private static final String UNDERBAR_C = '__c';
    /**
     * FLSチェックタイプ
     */
    public enum FLSType {
        //登録
        INSERT_OBJECT,
        //削除
        DELETE_OBJECT,
        //更新
        UPDATE_OBJECT,
        //検索
        SELECT_OBJECT
    }

    /**
     * 共通チェックFLS(項目)
     * @param objectName オブジェクト名
     * @param fieldList チェック項目リスト
     * @param type チェックタイプ
     */
    public static Boolean commmonCheckFLS(String objectName, List<String> fieldList, FLSType type) {
        objectName = objectName.contains(UNDERBAR_C) ? ENV_PREFIX + objectName : objectName;
        SObjectType objType = Schema.getGlobalDescribe().get(objectName);
        Map<String,Schema.SObjectField> m = objType.getDescribe().fields.getMap();
        if(type == FLSType.INSERT_OBJECT) {//登録権限
            for(String field : fieldList) {
                if(field.contains(UNDERBAR_C)) { //カスタム項目
                    if(!m.get(ENV_PREFIX + field).getDescribe().isCreateable()) {
                        return false;
                    }
                } else {  //標準項目
                    if(!m.get(field).getDescribe().isCreateable()) {
                        return false;
                    }
                }
            }
        } else if(type == FLSType.UPDATE_OBJECT) {//更新権限
            for(String field : fieldList) {
                if(field.contains(UNDERBAR_C)) { //カスタム項目
                    if(!m.get(ENV_PREFIX + field).getDescribe().isUpdateable()) {
                        return false;
                    }
                } else { //標準項目
                    if(!m.get(field).getDescribe().isUpdateable()) {
                        return false;
                    }
                }
            }
        } else if(type == FLSType.SELECT_OBJECT){//検索権限
            for(String field : fieldList) {
                if(field.contains(UNDERBAR_C)) { //カスタム項目
                    if(!m.get(ENV_PREFIX + field).getDescribe().isUpdateable()) {
                        return false;
                    }
                } else { //標準項目
                    if(!m.get(field).getDescribe().isUpdateable()) {
                        return false;
                    }
                }
            }
        } else if(type == FLSType.DELETE_OBJECT) {//削除権限
            if(!objType.getDescribe().isDeletable()) {
                return false;
            }
        }
        return true;
    }


    /**
     * 共通チェックFLS(オブジェクト)
     * @param objectName オブジェクト名
     * @param type チェックタイプ
     */
    public static Boolean commmonCheckFLS(String objectName, FLSType type) {
        objectName = objectName.contains(UNDERBAR_C) ? ENV_PREFIX + objectName : objectName;
        SObjectType objType = Schema.getGlobalDescribe().get(objectName);
        if(type == FLSType.INSERT_OBJECT) { //登録権限
            if(!objType.getDescribe().isCreateable()) {
                return false;
            }
        } else if(type == FLSType.DELETE_OBJECT) {//削除権限
            if(!objType.getDescribe().isDeletable()) {
                return false;
            }
        } else if(type == FLSType.UPDATE_OBJECT) {//更新権限
            if(!objType.getDescribe().isUpdateable()) {
                return false;
            }
        } else if(type == FLSType.SELECT_OBJECT) {//検索権限
            if(!objType.getDescribe().isAccessible()) {
                return false;
            }
        }
        return true;
    }

    /**
     * 接頭辞取得
     */
    public static String getPrefix(){
        ApexClass ac =[SELECT NamespacePrefix FROM ApexClass WHERE Name =: FLSUtil.class.getName()];
        String nameSpacePrefix = ac.NamespacePrefix;
        if(String.isEmpty(nameSpacePrefix)) {
            nameSpacePrefix = '';
        } else {
            nameSpacePrefix += '__';
        }
        return nameSpacePrefix;
    }

}

参考