• salesforce零基础学习(九十六)项目中的零碎知识点小总结(四)


    本篇参考:

    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]

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

  • 相关阅读:
    oracle角色、权限和用户
    轻松解决oracle11g 空表不能exp导出的问题
    oracle 11g杀掉锁的sql
    oracle创建表空间
    js 读取xml文件
    oracle decode函数使用方
    oracle的触发器的实战使用
    oracle获取日期的数字格式,24小时制
    oracle判断表中的某个字段是否为数字trim+translate函数或regexp_like函数
    java String字符串操作 字符串加密等
  • 原文地址:https://www.cnblogs.com/zero-zyq/p/13820688.html
Copyright © 2020-2023  润新知