Salesforce之共享規則

  最近,小喵對對象的共享規則進行了一些瞭解並做了一下筆記.

一.引言

客戶關係管理系統有許多與 Salesforce 中的記錄共享相關的應用程序。負責配置 Salesforce 的管理員並允許打開可訪問模式,不讓位於創建限制。在特定組織中,記錄共享是在Salesforce 共享規則的幫助下完成的,該規則向特定客戶開放訪問權限。

廢話不多說,下面瞭解Salesforce 共享規則、它們的創建、組件、相關優勢及其用法。 

二.什麼是Salesforce 中的共享規則?

簡單來說, 負責允許特定企業或一組區域中的各種客戶端訪問信息和數據的準則稱爲共享規則它們有助於根據角色和領土將共享訪問擴展到各種用戶。特定用戶被授予特殊訪問權限,以便他們可以自動對其組織做出期望,並履行他們對組織範圍共享設置的承諾。

目的是 爲特定用戶提供更大的訪問權限。

爲了能夠管理這種共享,首先應該分配一個具有管理級別的訪問權限。這些管理員被授予對系統中所有對象的完全訪問權限,並且能夠輕鬆地將它們配置爲可供多個用戶訪問。

三.Salesforce中共享規則的類型

Salesforce中有各種類型的共享規則。 例如 :

託管共享

        根據角色指南,Salesforce 管理共享中的層次結構和共享規則允許在記錄所有權的基礎上共享照明平臺允許的訪問權限。

2 .記錄所有權

        每條記錄都是特定用戶的所有權,包括各種用於案例和自定義對象。記錄的所有者將被自動授予訪問權限,沒有任何限制,用戶可以輕鬆查看、刪除、編輯或共享記錄。

3 .角色層次

        位於層次結構上層的人員或用戶可以在角色層次結構的幫助下訪問類似級別的記錄。此特定記錄可由位於層級以下的任何其他用戶擁有或共享,這就是如何通過授予位於層級以上或以下人員的完全訪問權限來隱式共享數據的方式。

4 .手動共享或用戶設法共享

        此授權是用戶或記錄或現在擁有記錄的完全所有權以訪問它並進一步共享它。該記錄可以與單個用戶或一組用戶共享。最終用戶負責單個記錄的用戶管理共享。只有記錄所有者和角色層次結構中位於記錄所有者之上的用戶才能授予完全訪問權限。

5.Apex託管共享

      藉助 Apex 託管共享下的共享要求,開發人員可以輕鬆支持特定應用程序。SOAP 或 API 允許這種共享,其中具有修改所有數據權限的用戶能夠添加或修改 Apex 託管共享。

四.Apex對象共享

在Apex中,每個對象都有一個“共享”對象,其中存儲了該對象的共享設定。

這種對象一般都是以''Share''結尾的,例如 :

        標準對象 客戶(Account) 的共享對象 是 AcountShare , 聯繫人 (Contact) 的共享對象 是 ContactShare ;

        自定義對象 書籍(Book__c)的共享對象 是 Book__share;

小結 : 標準對象的共享對象一般是對象名+''Share'' ,  自定義對象的共享對象一般是以 ''__share'' 結尾;

注意 : 在“主-詳細”(Master-Detail)關係中“詳細”方面的對象沒有對應的共享對象,因爲它的共享設定是由“主”方面的對象決定的。

 只有當對象的“組織範圍內默認”(Organizational-wide-default)設置爲“專用”(Private)時,共享對象纔會啓用。如果沒有啓用,在Apex代碼中調用“XXX__share”時會出現該類型不存在的錯誤。

這種設定的原因是:共享對象對應的是Salesforce內部數據庫中的共享數據表。當對象的“組織範圍內默認”設定爲“公共”的時候,該對象不存在單獨的共享設定,所以對應的共享對象也無法使用。

五. 共享對象屬性 

要想在Apex代碼中完成共享,肯定是需要了解這個共享對象都有哪些屬性的,要不然無從下手┭┮﹏┭┮

objectNameAccessLevel :  這個屬性表明了該共享的共享級別,其名字是對象名後面加上“AccessLevel” , 例如,LeadShare 對象的屬性名稱是 潛在客戶共享訪問級別. 有效值爲:  Edit、Read、All         其中, All 訪問級別是一個內部值,不能授予。  此字段必須設置爲高於組織對父對象的默認訪問級別的訪問級別 .

parentId :   該屬性表明了該共享對象對應的數據記錄的ID ,  此字段無法更新。

RowCause :  表明授予用戶或組訪問權限的原因。原因決定了共享的類型,它控制誰可以更改共享記錄。此字段無法更新。 默認值是“Manual” 。使用 Apex 編寫的手動共享包含 RowCause="Manual"默認。所有權更改時,僅刪除具有此條件的共享。

UserOrGroupId表明需要授予權限的用戶或組。 此字段無法更新。 ​需注意,​​​​​​ 不能使用 Apex 向未經身份驗證的訪客用戶授予訪問權限。

六.在Apex中完成共享

public class BookSharing {
   
   public static boolean manualShareRead(Id recordId, Id userOrGroupId){
      // 爲自定義對象 Job 創建新的共享對象。
      // Create new sharing object for the custom object Book.
      Book__Share bookShr  = new Book__Share ();
      
      // 設置共享記錄的ID。
      // Set the ID of record being shared.
      bookShr.ParentId = recordId;
        
      // 設置被授予訪問權限的用戶或組的 ID。
      // Set the ID of user or group being granted access.
      bookShr.UserOrGroupId = userOrGroupId;
      
      // 設置訪問級別。 有 讀 和 讀寫
      // Set the access level. Have  Read , Edit
      bookShr.AccessLevel = 'Read';
       
      // 將 rowCause 設置爲 'manual' 以進行手動共享。 
      // Set rowCause to 'manual' for manual sharing.
      // 這行可以省略,因爲'manual'是共享對象的默認值。
      // This line can be omitted as 'manual' is the default value for sharing objects.
      bookShr.RowCause = Schema.Book__Share.RowCause.Manual;
      
      // 插入分享記錄並抓取保存結果。   
      // Insert the sharing record and capture the save result. 
      // 如果傳遞了多個記錄,則 false 參數允許部分處理 
      // The false parameter allows for partial processing if multiple records passed 
      // 進入操作。
      // into the operation.
      Database.SaveResult sr = Database.insert(bookShr,false);
      
      // 處理保存結果。
      // Process the save results.
      if(sr.isSuccess()){
         // 表示成功
         // Indicates success
         return true;
      }
      else {
         //  獲取第一次保存結果錯誤。
         // Get first save result error.
         Database.Error err = sr.getErrors()[0];
         
         // 檢查錯誤是否與普通訪問級別有關。
         // Check if the error is related to trival access level.
         // 訪問級別必須比對象的默認級別更寬鬆。
         // Access level must be more permissive than the object's default.
         // 這些共享記錄不是必需的,因此插入異常是可以接受的。 
         // These sharing records are not required and thus an insert exception is acceptable. 
         if(err.getStatusCode() == StatusCode.FIELD_FILTER_VALIDATION_EXCEPTION  &&  
                  err.getMessage().contains('AccessLevel')){
            // 表示成功。
            // Indicates success.
            return true;
         }
         else{
            // 表示失敗。
            // Indicates failure.
            return false;
         }
       }
   }
   
}

七.創建 Apex 託管共享

trigger BookApexSharing on Book__c(after insert) {
    
    if(trigger.isInsert){
        // Create a new list of sharing objects for Book
        List<Book__Share> jobShrs  = new List<Book__Share>();
        
        // Declare variables for recruiting and hiring manager sharing
        Book__Share recruiterShr;
        Book__Share hmShr;
        
        for(Book__c book : trigger.new){
            // Instantiate the sharing objects
            recruiterShr = new Book__Share();
            hmShr = new Book__Share();
            
            // Set the ID of record being shared
            recruiterShr.ParentId = book.Id;
            hmShr.ParentId = book.Id;
            
            // Set the ID of user or group being granted access
            recruiterShr.UserOrGroupId = book.Recruiter__c;
            hmShr.UserOrGroupId = book.Hiring_Manager__c;
            
            // Set the access level
            recruiterShr.AccessLevel = 'edit';
            hmShr.AccessLevel = 'read';
            
            // Set the Apex sharing reason for hiring manager and recruiter
            recruiterShr.RowCause = Schema.Book__Share.RowCause.Recruiter__c;
            hmShr.RowCause = Schema.Book__Share.RowCause.Hiring_Manager__c;
            
            // Add objects to list for insert
            jobShrs.add(recruiterShr);
            jobShrs.add(hmShr);
        }
        
        // Insert sharing records and capture save result 
        // The false parameter allows for partial processing if multiple records are passed 
        // into the operation 
        Database.SaveResult[] lsr = Database.insert(jobShrs,false);
        
        // Create counter
        Integer i=0;
        
        // Process the save results
        for(Database.SaveResult sr : lsr){
            if(!sr.isSuccess()){
                // Get the first save result error
                Database.Error err = sr.getErrors()[0];
                
                // Check if the error is related to a trivial access level
                // Access levels equal or more permissive than the object's default 
                // access level are not allowed. 
                // These sharing records are not required and thus an insert exception is 
                // acceptable. 
                if(!(err.getStatusCode() == StatusCode.FIELD_FILTER_VALIDATION_EXCEPTION  
                                               &&  err.getMessage().contains('AccessLevel'))){
                    // Throw an error when the error is not related to trivial access level.
                    trigger.newMap.get(jobShrs[i].ParentId).
                      addError(
                       'Unable to grant sharing access due to following exception: '
                       + err.getMessage());
                }
            }
            i++;
        }   
    }
    
}

八.常見問題及使用時的注意事項

1.Salesforce 共享規則的組成部分是什麼?

        共享哪些記錄——我們可以共享基於該數據所有權或類似於類似會議標準的記錄。只允許與其他用戶或組共享屬於特定用戶的數據記錄。如果記錄是基於一個字段值,那麼它也可以與其他用戶共享。

       使用哪個用戶- 爲此,您必須創建一個公共組,負責簡化共享規則的創建。公共團體是具有某些共同特徵和行爲的個人的各種規則和角色的組合。

       什麼樣的訪問——在確定一個需求之後,授予訪問權限,訪問的形式可以是隻讀的,也可以是另一種可以讀寫的訪問。

2.Salesforce 中的共享規則有哪些限制

  1) 對規則的數量保持一定的控制 : 一個可以包括越來越多的 共享規則很可能包含多達 300 多個將爲每個對象定義的共享規則。但是沒有必要使用它們中的每一個。這就是爲什麼通常最好確保將基於所有權的共享規則限制爲每個對象 100 個,並將標準規則的數量限制爲 50 個,否則性能可能會受到影響,這可能會使管理變得更加困難。

  2)跟蹤分享規則 : 如果指定了太多共享規則,即使確保正確維護這些訪問權限,也可能難以管理。如果對任何用戶或角色的特定對象應用了多個規則,Salesforce 將進一步提供更多訪問權限,因此這些應該保持非常簡單。需要注意的是,一旦保存了共享規則,就無法在不重新創建整個規則的情況下更改已與其設置“共享對象”規則的用戶或角色。

  3)注意"查看全部"或"修改全部" : 我們應該始終意識到其中的危險權限 Salesforce 中的共享規則,它們是配置文件中的“查看全部”或“修改全部”。這些權限設置在特定的配置文件中或正確設置權限,其中應該授予對象訪問權限但授予對記錄的訪問權限,應限制自己使用它們。此外,應始終記住,這些權限不僅可以應用於對象級別,還可以應用於“所有數據”。

今天的分享就到這了,

有對這方面感興趣的小夥伴們可以查看以下內容:

<<Salesforce中的共享規則>>

<<Salesforce安全指南-共享規則>>

<<在Apex中共享記錄>>

<<S2實驗>>

 

(^_^)~喵~!!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章