在Salesforce中,with sharing
是一个关键字,用于指定在Apex类中强制执行基于配置文件和角色的安全性设置。它用于确保查询和操作数据时,Salesforce会根据用户的配置文件和角色权限来限制访问,以提高数据的安全性。
使用 with sharing
关键字的主要作用是:
-
基于配置文件和角色的权限强制执行: 通过使用
with sharing
,您可以确保Apex代码遵守Salesforce的安全性模型,强制执行用户的配置文件和角色权限。这意味着只有用户有权访问的数据和对象才能被查询和操作。 -
默认设置: 如果在Apex类中未明确指定
with sharing
或without sharing
,则默认情况下会使用with sharing
。这有助于确保数据安全性是默认的,并且不容易被意外地绕过。 -
避免潜在的数据泄露: 如果您不使用
with sharing
,则Apex代码将在系统上下文中运行,可以绕过用户的配置文件和角色权限。这可能导致潜在的数据泄露和安全风险。
示例:
public with sharing class MyApexClass {
public List<Account> getAccounts() {
// 使用with sharing确保只返回用户有权访问的帐户
return [SELECT Id, Name FROM Account];
}
}
在上述示例中,使用 with sharing
以确保查询只会返回当前用户有权访问的帐户记录。如果没有 with sharing
,则查询可能会返回所有帐户记录,无论用户是否有权访问它们。
总之,with sharing
是Salesforce中用于维护数据安全性的重要工具之一,它有助于确保只有具有适当权限的用户才能访问和操作数据。
对于触发器而言:
在Salesforce中,当您定义一个Apex触发器时,如果没有明确指定"with sharing"或"without sharing",则触发器将按照系统的默认行为运行,等同于"without sharing"。这意味着触发器在系统模式下运行,不强制执行记录级安全性和共享规则。因此,即使当前用户没有必要的权限,触发器也可以访问和修改记录。
通常情况下,不带共享规则的Apex触发器用于需要执行需要高特权的操作,如数据清理或系统级集成的情况。然而,在使用不带共享规则的触发器时,务必小心,因为它们可能绕过安全模型,如果实现不当,可能会导致安全风险。
以下是一个定义不带共享规则的Apex触发器的示例:
trigger MyTrigger on MyObject__c (before insert) {
// 触发器逻辑在这里
}
在上述触发器定义中,没有指定"with sharing"或"without sharing",这表示触发器在不带共享规则的情况下运行,与"without sharing"等效。
虽然在某些情况下使用不带共享规则的触发器可能是必要的,但必须记录和彻底测试它们,以确保不会损害Salesforce数据的安全性和完整性。此外,每当可能时,请考虑使用替代方法或功能,如权限集、自定义共享规则或基于平台事件的流程,以更好地控制数据访问和安全性。