本篇参考:

https://developer.salesforce.com/docs/atlas.en-us.216.0.apexcode.meta/apexcode/apex_classes_keywords_sharing.htm

https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_classes_with_security_enforced.htm

一. Currency 处理

我们在develop console执行以下的SQL,发现会报错, Unknown error parsing query。

select id, name,AnnualRevenue
from account
where AnnualRevenue >= 10000000000 

当时其实疑问挺多的,因为 AnnualRevenue是Currency类型,在我想象中,salesforce会使用 Decimal进行解析,Decimal的范围是 -2的63次方--2的63次方-1。在问群里大神以后知道了,如果值传递的是整数情况下,会使用 Integer进行转换,而 Integer的范围是 -2的31次方到2的31次方-1即-2147483648~2147483647,图中输入的值超过了这个值,所以报错。解决方案只需要后面变成 .0即可,salesforce便会将其转换成Decimal,从而可以进行正常搜索。

二. inherited sharing

在 Winter 19 version 44的时候,salesforce针对 sharing modal设置了三个模式, with sharing / with out sharing 以及 inherited sharing。在我们之前的篇中讲过salesforce 零基础开发入门学习(十二)with sharing 、without sharing 、无声明区别  无声明通常用于不知道当前的类应该 with/ with out,取决于前一个调用类的 sharing modal情况下使用无声明,在 v44以后,官方不建议使用 无声明的类,而是应该使用 inherited sharing这个声明,这种声明和无声明方式大体功能相同,但是更安全。他们也不是一点区别都没有,最大的区别如下:

当当前的class直接和前端页面交互时, inherited sharing默认是 with sharing,但是 不声明方式是without sharing。验证如下:

1. 类中使用 inherited sharing

public inherited sharing class InheritedSharingClass{
public List<Contact> getAllTheSecrets(){
return [SELECT Name FROM Contact];
}
}

2. vf页面直接关联当前的页面作为controller

<apex:page controller="InheritedSharingClass">
<apex:repeat value="{!allTheSecrets}" var="record">
{!record.Name}
</apex:repeat>
</apex:page>

当前的 contact的 OWD设置的 private,找一个低权限的人运行,展示效果如下:

我们可以看到,因为他没有Own以及被share的数据,所以展示空空如也。将apex 改一下:

public class InheritedSharingClass{
public List<Contact> getAllTheSecrets(){
return [SELECT Name FROM Contact];
}
}

结果展示:

可以看出来如果直接连接前台页面作为 controller的情况下两者的区别。另外需要考虑, inherited sharing只有v44以后才可以使用,以前的项目version低不可以使用。V44版本以后没有使用模式声明的情况下,建议添加 inherited sharing

三. WITH SECURITY_ENFORCED

security_enforced是 v45作为beta,48作为正式版,所以我们如果使用 SECURITY_ENFORCED最好在V48及以后使用。我们都知道,apex运行在 system上下文,也就是说运行时,apex会忽略当前的用户对某个表是否有权限,某个字段是否有权限,均可以进行CRUD操作。作为 ISV进行package开发或者其他严格的权限访问场景,可能需要根据当前的用户权限来决定是否可以访问哪些字段,比如schema命名空间去查看某个字段是否 isAccessable等等。 当我们在SOQL使用WITH SECURITY_ENFORCED以后,会严格按照当前user权限来走,如果当前权限对select的内容或者from内容有权限,按照正常走,如果没有权限,直接抛出异常。需要注意的是,这个关键字只针对 SELECT以及FROM内容的表字段有效,比如where或者order by等关键字后面的字段没有权限不影响。值得注意的是,这个关键字只能在apex中使用。官方给的demo如下:如果当前用户对 parent的website没有权限,则会抛出异常,结果返回空。

List<Account> act2 = [SELECT Id, parent.Name, parent.Website
FROM Account WITH SECURITY_ENFORCED]

总结:篇中对三部分进行简单的小结,更细节的使用方式建议自行查看官方文档。使用前一定要注意一下当前的版本号。篇中有错误地方欢迎指出,有不懂欢迎留言。

最新文章

  1. table表格中实现tbody部分可滚动,且thead部分固定
  2. 如何解决android studio 运行时中文乱码的问题
  3. GDAL编译(转)
  4. [java学习笔记]java语言基础概述之转义字符&amp;break&amp;continue
  5. android-adb通用
  6. C#工具类(包含获取枚举描述方法)
  7. Oracle常用操作
  8. JS框架设计读书笔记之-核心模块
  9. TensorLayer官方中文文档1.7.4:API – 数据预处理
  10. C#版 - Leetcode 201. 数字范围按位与(bitwise AND) - 题解
  11. PAT A1017 Queueing at Bank (25 分)——队列
  12. 深入理解.sync修饰符
  13. awk调用shell
  14. ntohs, ntohl, htons,htonl的比较和详解【转】
  15. Android 手机 ADB FastBoot 命令基本用法
  16. 15个常用GCC命令
  17. 【python 3.6】笨办法取出列表中的字典的value
  18. Keras学习-1
  19. 【Android学习】Android工程资源命名禁忌
  20. 【22,23节】Django的GET和POST属性笔记

热门文章

  1. jmeter压测以及用Badboy录脚本
  2. python 3 continue 循环控制
  3. zabbix-自动发现并监控
  4. Spark Driver Program剖析
  5. php第二天-函数的用法及封装,变量范围,匿名函数,递归函数
  6. Sorted Adjacent Differences(CodeForces - 1339B)【思维+贪心】
  7. 栈帧的内部结构--动态返回地址(Return Address)
  8. Java程序员面试学习资料汇总
  9. Typora操作总结
  10. shiro安全框架和spring整合