Salesforce的數據權限機制

本文主要介紹了 Salesforce 對於系統中數據的訪問控制是如何設計的,而後也瞭解了下 Alfresco 和 Oracle VPD 的數據權限機制。但願對一些業務系統的數據權限的訪問控制設計能有所參考和啓發。html

Salesforce

1. 產品功能

salesforce是基於 SaaS 的客戶關係管理系統(CRM),該系統提供的功能覆蓋了衆多不一樣的業務領域,例如:客戶資料存儲,銷售業務管理,協同辦公等。在此基礎上,Salesforce又提供了一個開發平臺以幫助其客戶根據自身的需求對核心系統進行定製和擴展。面試

2. 數據權限配置

在salesforce平臺,能夠控制哪些用戶能夠訪問哪些 Organization, Objects, Fields, Records 的數據,經過結合不一樣級別的安全控制,來爲成千上萬的應用提供恰到好處的數據訪問級別。數據庫

例以下面是在salesforce平臺上的一個招聘系統,開發者配置的數據權限:安全

如上圖中:網絡

  • Objects-Level Security:對象級別的數據權限,相似DB中的表。例如:面試官只能查看候選人和招聘職位信息,而不能查看offer信息。
  • Field-Level Security:列數據權限,相似DB表的列字段。例如:面試官能夠查看候選人的姓名、住址,而不能查看電話號碼、薪資等敏感信息。
  • Record-Level Security:行數據權限,相似DB表中的行記錄。例如:面試官只能查看本身所在部門下的候選人信息,而不能查看其它部門下的候選人信息。

下面詳細描述 salesforce 中數據的4種安全級別控制:app

1)Organization 的數據訪問控制

只有經過認證的員工才能登陸到系統,是最普遍的數據保護級別。經常使用的設定有用戶管理、密碼登陸、登陸IP限制等。框架

2)Objects 的數據訪問控制

Object能夠看作表。Object 是由 Records 組成,經過 profile 和 permission sets 來設置 objects 的數據訪問權限。一個用戶會有一個 profile 和許多 permission sets。數據庫設計

  • profile(簡檔):是 salesforce 爲每一個用戶指定的標準配置文件,在建立用戶時候指定(不一樣用戶可以使用同一profile)。經過一組規則集合,規定了用戶對這個系統各方面的權限。分爲 settings 和 permissions 兩部分:ide

    • settings:決定用戶能夠訪問哪些 objects函數

    • permissions:對 objects 上的 records 能執行哪些操做:增刪改查

  • permission sets(權限集):分配給用戶額外的權限和訪問規則,也由 settings 和 permissions 組成。permission sets 的權限範圍和 profile 是相似的。

一個用戶只能有一個 profile,但能夠有多個 permission sets。通常使用 profile 分配給用戶最低的權限集合,而後使用 permission sets 補充配置的其餘權限。兩個聯合使用,提供了訪問 objects 的靈活性。

下圖是 profile 中對象的權限設定:

3)Fields 的列訪問控制

Field可看作表中的列。有時,用戶能夠訪問 Objects,但不能訪問/修改 Object 的 Fields,例如:身份證信息、薪資信息等。Fields 列權限可經過 profile、permission sets 來控制

 

4)Records 的行訪問控制

Record可看作表中的行記錄。用戶訪問 Objects 時只能訪問子集中的一部分 Records。而控制 Records 的數據訪問範圍有四個方法:

① Org-wide defaults:組織範圍內的默認基礎設置。共享設置是數據安全級別的最底層,若是用戶在 profiles 或其餘地方對某些對象有其餘權限設定,則此處的權限設定會被忽略。

能夠對系統中每一個對象進行訪問權限設置,例以下圖:

有如下四種策略:

  • Private:只有 record 的擁有者(owner),以及上級能查看、編輯 

  • Public Read Only:全部用戶可查看 records,但只有擁有者和上級能編輯
  • Public Read/Write:全部用戶能夠查看、編輯 records

  • Controlled by Parent:一個用戶可查看、編輯、刪除一個 record,那就可對該 record 下面的 record 作一樣操做。

② Role hierarchies:salesforce 的角色是層級結構,相似於一個樹,擁有上級角色能夠同時擁有這個角色樹節點下級的全部角色的 Record 權限。

③ Sharing rules:將符合規則的一些行數據,賦予符合規則的一些用戶。一條共享規則包括:

  • 基本屬性:標籤、名字、描述等

  • 規則類型:能夠設定基於記錄全部人,仍是基於某些條件

  • 被共享的用戶:能夠設定此共享規則對哪些用戶生效。此處的用戶分爲三種:公用小組、角色、角色及下屬

  • 被共享用戶的訪問權限:被共享的用戶對於此數據有哪些權限

例以下圖:

④ Manual sharing:手動共享一條記錄給其餘人。Records 的擁有者給沒有 Records 權限的用戶授予該 Record 相應的讀寫權限。

 

3. 數據權限校驗

當用戶須要進入某條記錄、運行報表、搜索等操做時,salesforce 會檢查用戶的權限。因爲 salesforce 有着複雜的權限設定,會在權限設定更改時當即計算數據記錄的權限,而後將結果保存起來。這樣,當用戶對記錄操做時,不用在此時進行權限的計算(由於會使效率變慢),而是根據存儲好的權限結果直接判斷。

salesforce 主要使用三種數據表來管理各類權限設定:

  • 對象記錄表(Object Record Table):存儲着數據記錄

  • 對象共享表(Object Sharing Table):存儲着各個對象的共享權限,包括了各類權限設定:Role hierarchies, Sharing rules, Manual sharing等

  • 用戶組表(Group Maintenance Table):存儲着各個用戶和用戶組的關係

當須要決定某個用戶或用戶組對於某條記錄的權限時,會執行如下步驟:

  1. 在對象記錄表中找到這條記錄

  2. 在對象共享表中根據這條記錄的ID找到存儲於其中的共享權限

  3. 在用戶組表中根據用戶或組的ID找到對應的記錄,而後在對象共享表中找到和該用戶或組的ID相對應的共享權限

以上步驟執行完畢後,salesforce 便獲得了該用戶或用戶組對於這條記錄的權限。

 

4. 數據定義與存儲

Metadatas表:存儲用戶自定義的對象(Record)和對象所包含的字段(Field)的結構信息,不保存具體的數據。Metadata能夠保證極大的靈活性,搭配着配置化平臺使用。主要有兩大類:

  • Objects Metadata表:存儲對象的信息,主要字段包括:對象ID(ObjID),擁有這個對象的租戶ID(OrgID),對象的名稱(ObjName)等
  • Fields Metadata表:存儲對象附帶字段的信息,主要字段包括:字段ID(FieldID),擁有這個字段的租戶ID(OrgID),對象ID(ObjID),字段的名稱(FieldName),字段的數據類型(DataType),布爾字段表示這個字段是否須要被檢索(IsIndexed)

Data表:存儲用戶定製的對象和對象所包含字段的數據。主要也是兩大類:

  • Data表:存儲Metadata表中定義的對象和字段所對應的數據,主要字段包括:全局惟一ID(GUID),租戶ID(OrgID),對象ID(ObjID),存放對象名字的 Nature Name(例如:這行與會計對象有關,這行的 Nature Name 就多是 "Account Name")。除了這些核心字段外,這個表還有名字從 Value0~Value500 這501個列來存儲數據,並且這些列都是 varchar 格式來存儲不一樣類型的數據,這個列也成爲 flex 列。
  • Clob表:存儲那些 CLOD(Character Large Object,字符大對象)數據,對象最大支持 32000 個字符。

Piovt表:也稱"數據透視表",以去規範化格式存儲那些用於特殊目的的數據,好比用於檢索、惟一性和關係等。主要做用是提高處理這些特殊數據的讀取性能。主要有五種Piovt表:

  • Index Piovt表:因爲Data表中數據都是以flex列的形式存儲,全部很難在Data表的基礎上對數據進行檢索,因此引入Index Piovt表來解決這個問題,系統運行時,將須要索引的數據從Data表同步至Index Piovt表中相對應的字段來方便檢索。好比數據的類型是日期型的,那麼它會被同步至Index Piovt表中的日期字段。
  • UniqueFields Piovt表:用於幫助系統在Data表中字段實現惟一性約束
  • Relationships Piovt表:提供了"Relationship"這個數據類型來支持定義多個對象之間的關係,此表方便和加速了"Relationship"數據讀取的做用
  • NameDenorm表:是一個簡單的數據表用於存儲對象的ID(ObjID)和對象的實例的名字,主要讓一些僅需獲取名字的查詢訪問,讓一些簡單的查詢無需訪問規模龐大的Data表
  • FallbackIndex表:這個表記錄全部對象的名字,免去成本高昂的 "UNION" 操做,從而加速查詢 

對於Data、Objects和Fields表的舉例以下:

Objects Metadata表:定義正常數據庫設計的 user 表和 order 表

ObjID OrgID ObjName ...
001 10 user ...
002 10 order ...

 

  

 

Fields Metadata表:定義 user 表和 order 表的字段,user(userId, name, age),order(orderId, amount)

FieldID OrgID ObjID FieldName DataType IsIndexed FieldNum ...
001 10 001 userId string true 0 ...
002 10 001 name string true 1 ...
003 10 001 age int false 2 ...
004 10 002 amount long false 1 ...
005 10 002 orderId string true 0 ...

 

 

 

 

 

 

Data表:user 表和 order 表的具體內容。Value0, Value1等值的順序與Fields中FileldNum相對應,user.userId的FileldNum=0,則Value0存儲着userId的具體值

GUID OrgID ObjID Name Value0 Value1 Value2 ... Value500
1001 10 001 user name uid001 zhangsan 18 ...  
1002 10 002 order name oid002 100.0   ...  

 

 

 

 

5. 參考

官網域名:https://login.salesforce.com/

https://trailhead.salesforce.com/modules/data_security/units/data_security_overview

https://developer.salesforce.com/docs/atlas.en-us.212.0.securityImplGuide.meta/securityImplGuide/

Salesforce數據安全簡介

《Salesforce入門》

 

其餘系統的數據權限機制

1. Alfresco

產品功能:Alfresco是一款開源的企業內容管理系統(ECMS),爲企業提供了平常的文檔管理、協同工做、工做記錄管理、知識管理、網絡內容管理、圖片管理等多種功能。

數據權限:能夠對每一個頁面設置用戶的訪問和操做權限

設計思路:

1)權限設計:權限粒度細化到對象級別,又將權限分爲18種基本權限。在這18種基本權限上,又能夠擴展多個權限集。

權限集名稱

描述

包含元子權限

Read

讀權限

ReadProperties:讀對象的元數據

ReadChildren:讀下級節點

ReadContent:讀對象內容

Write

寫權限

WriteProperties:寫對象的元數據

WriteContent:寫對象內容

Delete

刪除權限

DeleteNode:刪除對象

DeleteChildren:刪除下級對象

AddChildren

添加子節點權限

CreateChildren:建立下級對象

LinkChildren:將其餘對象掛接到當前對象下

Execute

執行權限

ExecuteContent:執行對象內容

CheckIn

簽入權限

Unlock:對象解鎖

CheckOut

簽出權限

Lock:對象加鎖

CancelCheckOut

取消簽出權限

Unlock:對象加鎖

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

在以上8種經常使用權限集的基本上,又能夠擴展多個角色權限集:

角色權限集

描述

包含的子權限集

Consumer

使用者

Read

Editor

參與者

Consumer,Write,CheckOut,ReadPermissions

Contributor

協調員

Consumer,AddChildren,ReadPermissions

Collaborator

合做者

Editor,Contributor

Coordinator

系統管理員

全部權限

Administrator

超級管理員

全部權限

RecordAdministrator

記錄管理員

ReadProperties,ReadChildren,WriteProperties,ReadContent,DeleteChildren,CreateChildren,LinkChildren,DeleteAssociations,CreateAssociations

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2)用戶、組的設計:用戶能夠隸屬於多個組,一個組也能夠包括多個成員(組和用戶)

3)ACL(訪問控制表)機制:經過 ACL 機制實現對文檔的權限控制。ACL包含多個用戶、組的訪問權限,以下表:

成員名(組或用戶)

角色權限集名

Group1

Consumer

User1

Editor

User2

Read

 

 

 

 

 

 

 

注:Group1組中的全部成員擁有所在組的權限。

4)權限機制設計:內容庫中的每個對象(文件夾、文件等)都關係一個ACL對象。當用戶訪問內容庫的對象時,先根據該對象對應的 ACL 裏查找當前用戶擁有的該對象的權限,而後判斷當前用戶是否擁有操做該對象的相關權限,從而實現內容庫對象的權限管理。

Alfresco中的權限繼承機制容許內容庫對象繼承父級節點的權限,所以,在對象建立的時候沒必要爲每個對象分配ACL。只要爲目錄結構分配好權限,在對象建立之後默認繼承父級節點權限。經過用戶、組、ACL的靈活配置,能夠實現複雜的內容安全控制。

5)權限機制的具體實現:在底層把對象的操做規定了一個接口:NodeService。將對象的各類操做抽象爲幾種基本方法,如:getProperties(), setProperties()。將這些方法進行攔截,攔截的工做是經過當前操做用戶,當前操做的對象id,當前執行的操做,判斷是否能夠調用該方法,從而實如今底層實現對對象權限的控制。

參考:

Alfresco權限機制

 

2. Oracle VPD

產品功能:VPD(Virtual Private Database)是從數據庫層面實現數據訪問控制的一種成熟技術,歸屬 Oracle security框架下。經過 VPD,銀行即可以確保客戶只看到他們本身的賬戶,電信公司能夠安全地隔離客戶記錄,HR應用程序能夠支持複雜的員工記錄數據訪問原則。

如何使用:

VPD 是介於用戶 SQL 語句和實際執行對象之間的介質層。SQL 語句在執行前,會自動被攔截並進行額外處理,處理結果每每是在 where 語句中添加特殊的條件式。

將一個或多個安全策略與表或視圖關聯,當對帶安全策略的表訪問(select/insert/update/delete)時,數據庫將調用一個實施該策略的函數。策略函數返回一個訪問條件(where子句),即謂詞。應用程序將它附加到用戶的 SQL 語句,從而動態修改用戶的數據訪問權限。以下面例子所示:若是執行 select * from t_policy 語句,則可使用 VPD 添加 where t2 not in (10) 子句:

(1)創建測試數據表(t_policy):

CREATE TABLE T_POLICY 
(
  T1  VARCHAR2(10 BYTE), 
  T2  NUMBER(10) 
); 
insert into t_policy values('a',10); 
insert into t_policy values('b',20); 
insert into t_policy values('c',30); 
commit; 

(2)創建VPD須要的策略,這裏的名字是:Fn_GetPolicy

CREATE OR REPLACE function Fn_GetPolicy(P_Schema In Varchar2,P_Object In Varchar2) return varchar2 is 
  Result varchar2(1000); 
begin 
  Result:='t2 not in (10)';     -- t2 != 10
  return(Result); 
end Fn_GetPolicy; 

(3)將策略與須要保護的表進行關聯:

declare 
Begin 
Dbms_Rls.Add_Policy( 
Object_Schema =>'niegc',  --數據表(或視圖)所在的Schema名稱 
Object_Name =>'T_Policy', --數據表(或視圖)的名稱 
Policy_Name =>'T_TestPolicy', --POLICY的名稱,主要用於未來對Policy的管理 
Function_Schema =>'NIEGC',  --返回Where子句的函數所在Schema名稱 
Policy_Function =>'Fn_GetPolicy', --返回Where子句的函數名稱 
Statement_Types =>'Select,Insert,Update,Delete', --要使用該Policy的DML類型,如'Select,Insert,Update,Delete' 
Update_Check =>True, --僅適用於Statement_Type爲'Insert,Update',值爲'True'或'False'. 若是爲'True',則用戶插入的值不符合Policy_Function返回條件時,該DML執行返回錯誤信息。
Enable =>True    --是否啓用,值爲'True'或'False' 
); 
end; 

(4)驗證VPD效果

執行用戶SQL:

select * from t_policy;

此時結果會少了t2=10這項

參考:

Oracle VPD實現數據細粒度訪問

Oracle VPD詳解 

相關文章
相關標籤/搜索