课程章节介绍
同学们,我们来看这一页幻灯片,讲的是Apex代码运行时的权限模式。
大家可能知道,平时我们写的Apex代码,默认是在“用户模式”下执行的。也就是说,它会尊重当前登录用户的权限——用户能看见什么字段、能操作哪些对象,代码就只能做什么。但有些时候,我们需要暂时绕过这些限制,比如管理员要做一些后台批量更新,不希望被字段级安全挡住。这时候,我们就可以显式地切换到“系统模式”。
怎么切换呢?分几种情况。
对于查询语句,也就是SOQL和SOSL,你可以在查询末尾加一个子句,用`WITH USER_MODE`表示仍然按用户权限来,或者用`WITH SYSTEM_MODE`表示忽略字段和对象的访问限制。
对于DML操作,如果你用的是`Database`类的方法,比如`Database.insert`、`Database.update`,那么可以在参数里传入`AccessLevel.USER_MODE`或`AccessLevel.SYSTEM_MODE`。这个特性目前还是Developer Preview,未来还可以通过指定一个权限集,在系统模式下也保持一定的安全检查,增强安全性。
这里有一个容易混淆的地方,同学们要注意:用户模式会全面应用共享规则、字段级安全和对象权限,完全以用户身份执行。而系统模式虽然忽略了字段和对象权限,但它对共享规则的态度却很微妙——它到底看不看共享规则,取决于你类的声明里有没有用`with sharing`、`without sharing`这些关键字。换句话说,在系统模式下,记录级别的共享控制仍然受类本身的共享设置影响,不能简单认为系统模式就能看到所有记录。
好了,这一页的核心就是这些。简单总结一下:默认用户模式,需要超越权限时切到系统模式;查询用`WITH`子句,DML用`Database`方法的参数;系统模式不跳过共享规则的约束,共享规则由类的关键字决定。这样讲,大家明白了吗?
关键词
Apex
Salesforce
Developer Guide