本文主要介紹了 Salesforce 對於系統中數據的訪問控制是如何設計的,而後也瞭解了下 Alfresco 和 Oracle VPD 的數據權限機制。但願對一些業務系統的數據權限的訪問控制設計能有所參考和啓發。html
salesforce是基於 SaaS 的客戶關係管理系統(CRM),該系統提供的功能覆蓋了衆多不一樣的業務領域,例如:客戶資料存儲,銷售業務管理,協同辦公等。在此基礎上,Salesforce又提供了一個開發平臺以幫助其客戶根據自身的需求對核心系統進行定製和擴展。面試
在salesforce平臺,能夠控制哪些用戶能夠訪問哪些 Organization, Objects, Fields, Records 的數據,經過結合不一樣級別的安全控制,來爲成千上萬的應用提供恰到好處的數據訪問級別。數據庫
例以下面是在salesforce平臺上的一個招聘系統,開發者配置的數據權限:安全
如上圖中:網絡
下面詳細描述 salesforce 中數據的4種安全級別控制:app
只有經過認證的員工才能登陸到系統,是最普遍的數據保護級別。經常使用的設定有用戶管理、密碼登陸、登陸IP限制等。框架
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 中對象的權限設定:
Field可看作表中的列。有時,用戶能夠訪問 Objects,但不能訪問/修改 Object 的 Fields,例如:身份證信息、薪資信息等。Fields 列權限可經過 profile、permission sets 來控制
Record可看作表中的行記錄。用戶訪問 Objects 時只能訪問子集中的一部分 Records。而控制 Records 的數據訪問範圍有四個方法:
① Org-wide defaults:組織範圍內的默認基礎設置。共享設置是數據安全級別的最底層,若是用戶在 profiles 或其餘地方對某些對象有其餘權限設定,則此處的權限設定會被忽略。
能夠對系統中每一個對象進行訪問權限設置,例以下圖:
有如下四種策略:
Private:只有 record 的擁有者(owner),以及上級能查看、編輯
Public Read/Write:全部用戶能夠查看、編輯 records
Controlled by Parent:一個用戶可查看、編輯、刪除一個 record,那就可對該 record 下面的 record 作一樣操做。
② Role hierarchies:salesforce 的角色是層級結構,相似於一個樹,擁有上級角色能夠同時擁有這個角色樹節點下級的全部角色的 Record 權限。
③ Sharing rules:將符合規則的一些行數據,賦予符合規則的一些用戶。一條共享規則包括:
基本屬性:標籤、名字、描述等
規則類型:能夠設定基於記錄全部人,仍是基於某些條件
被共享的用戶:能夠設定此共享規則對哪些用戶生效。此處的用戶分爲三種:公用小組、角色、角色及下屬
被共享用戶的訪問權限:被共享的用戶對於此數據有哪些權限
例以下圖:
④ Manual sharing:手動共享一條記錄給其餘人。Records 的擁有者給沒有 Records 權限的用戶授予該 Record 相應的讀寫權限。
當用戶須要進入某條記錄、運行報表、搜索等操做時,salesforce 會檢查用戶的權限。因爲 salesforce 有着複雜的權限設定,會在權限設定更改時當即計算數據記錄的權限,而後將結果保存起來。這樣,當用戶對記錄操做時,不用在此時進行權限的計算(由於會使效率變慢),而是根據存儲好的權限結果直接判斷。
salesforce 主要使用三種數據表來管理各類權限設定:
對象記錄表(Object Record Table):存儲着數據記錄
對象共享表(Object Sharing Table):存儲着各個對象的共享權限,包括了各類權限設定:Role hierarchies, Sharing rules, Manual sharing等
用戶組表(Group Maintenance Table):存儲着各個用戶和用戶組的關係
當須要決定某個用戶或用戶組對於某條記錄的權限時,會執行如下步驟:
在對象記錄表中找到這條記錄
在對象共享表中根據這條記錄的ID找到存儲於其中的共享權限
在用戶組表中根據用戶或組的ID找到對應的記錄,而後在對象共享表中找到和該用戶或組的ID相對應的共享權限
以上步驟執行完畢後,salesforce 便獲得了該用戶或用戶組對於這條記錄的權限。
Metadatas表:存儲用戶自定義的對象(Record)和對象所包含的字段(Field)的結構信息,不保存具體的數據。Metadata能夠保證極大的靈活性,搭配着配置化平臺使用。主要有兩大類:
Data表:存儲用戶定製的對象和對象所包含字段的數據。主要也是兩大類:
Piovt表:也稱"數據透視表",以去規範化格式存儲那些用於特殊目的的數據,好比用於檢索、惟一性和關係等。主要做用是提高處理這些特殊數據的讀取性能。主要有五種Piovt表:
對於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 | ... |
官網域名: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入門》
產品功能: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,當前執行的操做,判斷是否能夠調用該方法,從而實如今底層實現對對象權限的控制。
參考:
產品功能: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這項
參考: