本文主要介绍了 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这项
参考: