目的
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;
}
}
参考
Salesforce Developers
[Salesforce]ApexでCRUD/FLSのチェック · GitHub