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]

總結:篇中對三部分進行簡單的小結,更細節的使用方式建議自行查看官方文檔。使用前一定要注意一下當前的版本號。篇中有錯誤地方歡迎指出,有不懂歡迎留言。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM