salesforce零基礎學習(九十六)專案中的零碎知識點小總結(四)

zero.zhang發表於2020-10-19

本篇參考:

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]

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

相關文章