本篇参考:

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]

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

salesforce零基础学习(九十六)项目中的零碎知识点小总结(四)的更多相关文章

  1. salesforce零基础学习(九十)项目中的零碎知识点小总结(三)

    本次的内容其实大部分人都遇到过,也知道解决方案.但是因为没有牢记于心,导致问题再次出现还是花费了一点时间去排查了原因.在此记录下来,好记性不如烂笔头,争取下次发现类似的现象可以直接就知道原因.废话少说 ...

  2. salesforce 零基础学习(六十八)http callout test class写法

    此篇可以参考: https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_classes_restfu ...

  3. salesforce零基础学习(一百零三)项目中的零碎知识点小总结(五)

    本篇参考:Salesforce Admin篇(四) Security 之Two-Factor Authentication & Single Sign On https://developer ...

  4. salesforce零基础学习(八十八)项目中的零碎知识点小总结(二)

    通过做项目以及群里面的一些大神的聊天,总结一下关于项目中的两个知识点,以后当做参考. 一. 在custom setting中配置集成接口信息后刷sandbox的问题 我们做项目时,经常会遇见和其他平台 ...

  5. salesforce零基础学习(一百一十二)项目中的零碎知识点小总结(四)

    本篇参考: https://trailblazer.salesforce.com/issues_view?id=a1p4V0000003znDQAQ https://salesforce.stacke ...

  6. salesforce零基础学习(七十二)项目中的零碎知识点小总结(一)

    项目终于告一段落,虽然比较苦逼,不过也学到了好多知识,总结一下,以后当作参考. 一.visualforce标签中使用html相关的属性使用 曾经看文档没有看得仔细,导致开发的时候走了一些弯路.还好得到 ...

  7. salesforce 零基础学习(六十五)VF页面应善于使用变量和函数(一)常用变量的使用

    我们在使用formula或者validation rules等的时候通常会接触到很多function,这些函数很便捷的解决了我们很多问题.其实很多函数也可以应用在VF页面中,VF页面有时候应该善于使用 ...

  8. salesforce 零基础学习(六十三)Comparable实现Object列表数据的自定义排序

    项目中通常有些需求为需要将某个sObject的数据列表按照某种规则排序显示到前台页面上,但是list上面的sort远远满足不了复杂的功能,此种情况需要自定义比较两个object大小的方法,所以需要创建 ...

  9. salesforce 零基础学习(六十二)获取sObject中类型为Picklist的field values(含record type)

    本篇引用以下三个链接: http://www.tgerm.com/2012/01/recordtype-specific-picklist-values.html?m=1 https://github ...

随机推荐

  1. oracle数据处理之exp/imp

    oracle 导出/导入数据方法一 exp/imp工具:1 将数据库oracle01完全导出,DBA:sys,密码:123456:用户名Scott 密码123456 导出到D:\emp.dmp中 ex ...

  2. Docker网络(五)

    本章内容 1.dokcer默认自带的几种网络介绍 2. 自定义网络 3. 容器间通信 4. 容器与外界交互 docker网络分为单个主机上的容器网络和多个主机上的哇网络,本文主要讲解单个主机上的容器网 ...

  3. 深入理解python语言

    2008年,安卓操作系统诞生:PC时代向移动时代转换 互联网,视窗 2017/5/27柯洁最终0:3AlphaGo 计算机技术的演进过程 不同编程语言的设计初心和适用对象 C语言核心解决的是性能问题, ...

  4. java 常用类-String-1

    一.字符串相关的类 1.1 String 的特性 String类:代表字符串.Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现. String是一个fin ...

  5. 使用binlog2sql恢复数据

    binlog2sql 是一款比较常用的数据恢复工具,可以通过它从MySQL binlog解析出你要的SQL,并根据不同选项,可以得到原始SQL.回滚SQL.去除主键的INSERT SQL等.主要用途如 ...

  6. Jmeter引用外部jar包的几种方法

    总结记录下jmeter引用外部jar包的3种方法及其优缺点: 一.测试计划中添加目录或jar包到Classpath 操作:测试计划->添加目录或jar包到Classpath-->浏览导入j ...

  7. Redis5设计与源码分析读后感(二)简单动态字符串SDS

    一.引言 学习之前先了解几个概念: SDS定义:简单动态字符串,Redis的基本数据结构之一,用于储存字符串和整型数据. 二进制安全:C语言中用"\0"表示字符串结束,如果字符串本 ...

  8. pwnable.kr-cmd2-witeup

    程序清除了环境变量,解决对策是使用绝对地址使用各种命令和文件. 程序的过滤策略更加严格,过滤了/.天哪,使用绝对路径必用/,怎么办咩? 解决办法是使用pwd变量,它会显示当前目录,然而在/目录下执行此 ...

  9. Linux Shell脚本简单语法汇总(Deepin下运行)

    整理自: https://www.runoob.com/?s=shell Shell 脚本(shell script),是一种为 shell 编写的脚本程序. 业界所说的 shell 通常都是指 sh ...

  10. dbdeployer MySQL沙盒部署详解

    一.工具介绍 前几日用mysql-sandbox来搭建MySQL8.0新版本时发现用不了,提示需要使用dbdeployer才行,瞬间觉得mysql-sandbox不香了,只好咬咬牙来熟悉dbdeplo ...