首页
/ SOQL-Lib 项目中的字段级安全(FLS)最佳实践

SOQL-Lib 项目中的字段级安全(FLS)最佳实践

2025-06-19 22:29:20作者:吴年前Myrtle

理解字段级安全(FLS)的重要性

在Salesforce开发中,字段级安全(Field-Level Security, FLS)是一个关键的安全特性,它控制着用户对对象字段的访问权限。SOQL-Lib项目提供了一套优雅的机制来处理FLS,让开发者能够更轻松地构建安全的Apex代码。

默认安全模式:USER_MODE

SOQL-Lib默认采用USER_MODE模式运行查询,这是最安全的做法:

public inherited sharing class SOQL_Account extends SOQL implements SOQL.Selector {
    public static SOQL_Account query() {
        return new SOQL_Account();
    }

    private SOQL_Account() {
        super(Account.SObjectType);
        with(Account.Name, Account.AccountNumber);
    }
}

在这种模式下,系统会自动检查:

  1. 用户是否有访问Account对象的权限
  2. 用户是否有访问Name和AccountNumber字段的权限
  3. 根据用户的共享设置过滤记录

系统模式:SYSTEM_MODE

在某些特殊场景下,你可能需要绕过安全限制,这时可以使用SYSTEM_MODE:

private SOQL_Account() {
    super(Account.SObjectType);
    with(Account.Name, Account.AccountNumber)
        .systemMode();
}

SYSTEM_MODE会忽略:

  • 对象权限检查
  • 字段级安全限制
  • 共享规则

注意:除非有充分理由,否则不建议使用SYSTEM_MODE,因为它会降低系统的安全性。

混合安全模式:保留FLS但忽略共享规则

有时我们需要一个折中方案:保留字段级安全检查但忽略共享规则。这可以通过组合使用systemMode()、withoutSharing()和stripInaccessible()实现:

private SOQL_Account() {
    super(Account.SObjectType);
    with(Account.Name, Account.AccountNumber)
        .systemMode()
        .withoutSharing()
        .stripInaccessible();
}

这种配置下:

  • 仍然会检查字段级安全
  • 忽略共享规则
  • 返回结果时会自动过滤掉用户无权访问的字段

实际应用场景分析

  1. 标准业务逻辑:使用默认USER_MODE,确保完全遵守安全模型
  2. 后台批处理:可能需要SYSTEM_MODE以访问所有数据
  3. 报表功能:混合模式适合需要跨部门数据但不暴露敏感字段的场景

安全开发建议

  1. 始终优先考虑使用默认的USER_MODE
  2. 如果必须使用SYSTEM_MODE,添加详细注释说明原因
  3. 定期审查使用SYSTEM_MODE的代码
  4. 考虑使用stripInaccessible()作为SYSTEM_MODE的安全补充

通过SOQL-Lib提供的这些灵活选项,开发者可以在保证系统安全性的同时,满足各种复杂的业务需求。记住,安全不是可选项,而是每个开发者的责任。

登录后查看全文
热门项目推荐