课程章节介绍
咱们这节课来聊聊 Apex 里面的“共享”规则,这其实指的就是记录级安全性。很多人一听到“共享”会以为是跟别人共享数据,没错,但在代码里它控制的是:当前用户能看到、能操作哪些记录。
在 Apex 里,默认情况下,如果你没写任何关键字,它不强制施行共享规则,也就是说不理睬用户的权限,能看到所有数据。但通常我们会在类定义时加上关键字来告诉系统:“请尊重用户的权限”。
这里面有三个关键字:`with sharing`、`without sharing`、`inherited sharing`,我们一个一个说。
第一个,`with sharing`,就是“带着共享模式”。写在类定义上,这个类里的所有查询、更新操作都会遵守当前用户的共享规则。比如,销售只能看他自己的机会,那代码里查询机会时,就只会返回他有权限的记录。
第二个,`without sharing`,正好相反,“不带共享模式”。哪怕当前用户权限很低,这个类也能看到所有数据,像管理员一样。用它的时候要很小心,通常只在需要跨所有记录操作时,比如数据清理、生成报表这类后端逻辑。
第三个,`inherited sharing`,这是比较推荐的新写法。它意思是“听调用者的”——如果调用它的类是用 `with sharing` 跑的,那它就跟着用共享模式;如果调用者不用共享,它也不共享。这样更灵活,一个类可以被不同场景复用,而不会出现权限漏洞。
另外还有一点,内部类,也就是写在另一个类里面的类,它的共享模式跟外层调用者一样。如果是通过继承,子类会继承父类的共享设置。
这些共享设置主要影响两件事:
- SOQL 和 SOSL 查询:如果用了共享模式,可能返回的行数会变少,因为系统自动过滤掉了用户看不见的记录。
- DML 操作:如果你尝试更新或插入一条记录,但它关联的外部记录(比如查找字段指向的东西)用户没有访问权,操作就会失败。
最后特别提醒一点:`with sharing` 只管记录级安全,不管字段级安全(FLS,Field-Level Security)。也就是说,就算用户对某个对象的某个字段没有读取权限,在 `with sharing` 的类里,代码仍然可以读取甚至修改那个字段的值。字段级安全需要用 `stripInaccessible` 或检查 `Schema.sObjectType` 来单独控制,这个咱们后面会详细讲。
好,今天的知识点就是这些。记住关键区别:共享控制的是 ,哪些行,,FLS控制的是 ,哪些列,。有疑问吗?没有的话我们就准备下一个内容啦。
关键词
Apex
Salesforce
Developer Guide