在 Salesforce 开发者控制台中的"匿名执行"代码(Anonymous Apex)是以当前登录用户的身份执行的。执行时会根据该用户的权限、共享设置和数据访问权限来决定代码的实际访问范围。
因此,在匿名执行中:
- 代码会遵守当前用户的数据访问控制(Sharing Rules),只能访问当前用户有权限查看或编辑的数据。
- 如果需要以"系统模式"执行(忽略共享规则),可以在匿名 Apex 中使用
without sharing
关键字声明一个类并在其中执行相关逻辑。
如果管理员账号对某个字段不可见,那么在开发者控制台的匿名执行中也无法访问该字段。这是因为匿名执行会遵循当前用户的字段级别安全性(Field-Level Security,FLS),即便是管理员账号,如果该字段在配置中对管理员不可见,匿名执行也无法访问。
解决方案
如果需要在匿名执行中访问受限字段,可以尝试以下方法:
- 检查和调整字段级别安全性:确认管理员账号是否具备该字段的读取或写入权限。
- 在系统模式下执行代码 :将需要的逻辑封装到
without sharing
的类方法中,并通过执行匿名 Apex 调用该方法。注意,这仅忽略共享规则,但不忽略字段级别的安全性。因此,仍然需要确保管理员对该字段的访问权限已被授予。 - 权限集或配置文件更新:直接为管理员配置所需字段的访问权限。这样,匿名执行时可以直接访问这些字段。
在系统模式 下执行代码时,Salesforce 会忽略共享规则(Sharing Rules) ,但不会忽略字段级别安全性(Field-Level Security, FLS)。因此,即使代码运行在系统模式下,如果当前用户对某个字段没有可见权限,系统模式下的代码依然无法访问该字段。
关键点总结
- 系统模式:忽略共享规则,允许代码访问所有记录数据,但不忽略字段级别安全性。
- 字段级别安全性(FLS):即使在系统模式下,字段级别安全性仍然生效,无法访问当前用户无权限查看的字段。
解决方案
如果希望在系统模式下访问特定字段,可以考虑:
- 检查权限配置:确保管理员或执行代码的用户有该字段的访问权限。
- 绕过字段级别安全性 :在某些情况下,可以在自定义接口(如 REST API)中,通过
Schema.DescribeFieldResult
检查字段权限并动态执行逻辑。
不过存在一种情况,即在系统模式下执行的 Apex 代码可以忽略字段级别安全性(FLS) 。在 Salesforce 中,触发器(Triggers) 、批处理(Batch Apex) 、计划任务(Scheduled Apex) 以及某些 非匿名执行 的 Apex 类会在系统模式下运行,并能够访问所有字段和记录数据,而不受字段级别安全性的限制。
因此,匿名执行(Anonymous Apex) 是遵循当前用户的字段权限的,但其他在系统模式下执行的 Apex(如触发器和批处理)可以直接访问字段,即使当前用户没有权限。
区分匿名执行与系统模式下的执行
- 匿名执行(Anonymous Apex):始终遵循当前用户的字段级别安全性。
- 触发器、批处理和计划任务:在系统模式下运行,不受字段级别安全性影响,能够访问所有字段。
示例场景
- 如果在开发者控制台使用匿名执行代码测试访问字段权限,则会受到字段级别安全性限制。
- 但在触发器或批处理类中,即使用户没有对某个字段的访问权限,代码依然可以访问并操作该字段。
因此,如果希望绕过字段级别安全性,可以通过触发器或批处理类的方式来执行逻辑,这些运行在系统模式下的代码不受字段权限限制。