本篇参考:

https://trailhead.salesforce.com/en/users/strailhead/trailmixes/architect-sharing-and-visibility

http://resources.docs.salesforce.com/210/10/en-us/sfdc/pdf/sharing_architecture.pdf

Salesforce作为一个出色的Saas平台,绝不是仅仅因为其推出了classic / lightning的各种开发的框架和语言,所以我们作为开发者来说不应该仅仅的局限于vf / aura / lwc的开发,而是更多的去了解掌握其所自带的标准的功能,权限管理以及一些paas。本篇主要讲述一些关于Salesforce常用的 Sharing 以及 Visibility的知识。感兴趣Sharing 的可以查看上方官方的提供的pdf文档,有时间的可以做一下上面的sharing-and-visibility的trailmix。本篇属于基础知识篇,讲的内容可能会较散,抛砖引玉。

这张图在很多地方大家都能看到,salesforce的sharing的架构图。我们挑常用的进行描述。

一. (View All | Modify All) VS (View All Data | Modify All Data)

当我们在创建一个Profile时,会有很多细节的权限控制,其中 View All Data | Modify All Data代表着这个Profile对应的user对系统中所有的对象拥有的View 以及Modify的权限,如果我们希望某些user拥有类似管理员的权限或者System Read Only的权限,可以设置这两个 View All Data | Modify All Data。

View All | Modify All 是针对具体的表进行的设置,我们有时需要类似某个表的delegation admin的权限,希望他可以忽略sharing rule / sharing setting可以查看到或者编辑到某个表的所有数据,这个时候我们只需要针对这个 profile 的这个表权限设置 View All | Modify All即可。

二. Org-Wide Defaults(OWD)

需要注意的是,Org-Wide Defaults 是唯一的一个方式来限制用户的记录访问。怎么可以更好的理解呢,比如一个系统中除了一个人以外,其他人对所有opportunity都有read only权限,那我们默认需要设置的Org-Wide Defaults针对Opportunity应该为 Private 而不是 Read Only,因为 Org-Wide Defaults是唯一的方式去限制用户记录访问,如果设置成了Read Only,则没有其他的方式去限制那个人的针对Opportunity的记录访问。所以 Org-Wide Defaults我们设置某个表的访问权限时应该考虑最小的权限的人的记录访问权限应该是什么。 Org-Wide Defaults 也对我们的权限进行了范围的设定。通过上面的图我们可以知道Profile针对一个表可以设置 Read / Create /Edit /Delete / View All / Modify All。上图中我们设置了 Accounts拥有了CRUD的权限,如果我们在Org-Wide Defaults中对Accounts设置的Sharing Setting是 read-only,代表着这个Profile的用户可以访问到系统中的所有的Accounts,然而只有他Own的或者只有通过其他sharing工具赋予给他Edit/ Delete权限的记录他才可以操作,其他的他只拥有Read记录的权限,因为 Org-Wide Defaults设置的是 read-only,尽管他对 Account这个表拥有CRUD权限,不代表他对所有的记录都可以为所欲为。同样的,如果系统中Org-Wide Defaults 对 Accounts设置了 Public Read/ Write权限,但是 Profile针对 Account只有 Read/ Create权限,他同样没法Edit所有的记录,因为这个 Profile没有Edit权限。

设置 Org-Wide Defaults我们只需要 Set Up处搜索 Sharing Settings即可。下图中我们可以看到有几列内容信息,其中Default Internal Access 代表着针对内部用户的默认的访问权限,Default External Access代表着针对 Portal Community用户的记录访问权限,要求是针对外部用户的访问权限一定要比内部的访问权限严格或者持平,不能外部超过内部。学习可查看此视频:http://salesforce.vidyard.com/watch/4I62yWd-0q-wpv2qR3hyKQ

设置权限可以设置以下的几个选项:

  • Private: 只有owner和管理员以及授予了对此纪录读或者写权限的人可以访问到此条记录,否则没有权限访问到这条数据;
  • Public Read Only: 所有人都能看到这条数据,只有owner以及管理员可以修改
  • Public Read/Write: 所有人都能看到和修改这条数据。
  • Controlled By Parent: 此种针对master-detail具有父子关系的,用户对父拥有什么,对子就拥有什么数据权限。比如对某条Account拥有Edit权限,则对他对应的Contact也拥有Edit权限。

详细的访问权限的描述可以参考:https://help.salesforce.com/articleView?err=1&id=sharing_model_fields.htm&type=5

我们针对Profile对某个表拥有的权限以及Organization-Wide Defaults权限设置和不是他own的记录拥有的操作权限整理一个表格如下:

User Permission OWD List View show 'New'? Can access detail he not own? Detail show 'Edit'/'Delete' Action?(Not Owner) Can Edit/Delete?
CRED Private Yes No No No
CR Private Yes No No No
CRED Public Read Only Yes Yes Yes No(展示Edit/Delete按钮,点击会提示权限问题)
CR Public Read Only Yes Yes No No
  Public Read Only No(没有权限访问这个表,列表也不展示) No No No
CRED Public Read/Write Yes Yes Yes Yes
CR Public Read/Write Yes Yes No No

Grant Access Using Hierarchies这一列用来设置数据方式是否遵循 Role Hierarchy中,勾选的情况下数据遵循Role Hierarchy原则,即如果作为当前用户的经理或者领导级别(Role Tree上层)可以看到并且操作他的数据,只要勾选以后不需要其他的任何的配置是自动拥有这个功能的。针对敏感的数据,有些可能要求只能数据的owner以及管理员可以看到访问数据,这种情况下就需要将这个表的Grant Access Using Hierarchies 反选掉。

三. Profile & Permission Set

Profile & Permission Set 用于控制object-level的数据安全,通过用户可以看到什么类型的数据并且是否他们可以对数据进行CRUD来决定。 一个用户只能拥有一个Profile,但是相同的Profile的不同用户针对不同的表可能有细微的访问的区别,所以这个时候需要用到 Permission Set。一个user可以有多个 Permission Set来增强访问。 Profile常用设置以下的权限(可以设置的选项太多,自行查看):

  • Object CRUD View All / Modify All权限;
  • Object Field Level Security的设定;
  • VF Page & Apex Class的security设定;
  • Login Hour & IP Range;

Permission Set可以设置大部分 Profile设置项,但是不是所有的项 Permission Set都能搞定,所以有些项目可能只是基于 Permission Set进行管理而不是 Profile,需要先确定一下 Permission Set是否可以支持,比如 Permission Set不支持  Login Hour & IP Range。

四. Owner

一条记录会有created by,也会有owner。Created By 是记录的创建人,谁创建Created by 就是谁,无法更改。 Owner 默认是创建者,但是可以进行更改。Owner可以在程序中修改,针对 lead/case也可以使用assignment rule去设置。Owner可以是一个User,也可以是一个queue,这个我们可以在lead/case assignment rule选择owner便可以看出来owner不仅仅只可以是一个user。 一条记录的owner可以进行manual share给其他人。Sharing Rule也可以基于owner去进行数据的share。所以 Owner概念的理解对Sharing Rule 以及 Manual Share有至关重要的作用

五. Sharing Rule

当OWD设置完以后,如果针对特殊的share场景,owner可以进行manual share,但是如果share的数据量过多或者有规律可循的,我们可以使用Sharing Rule进行设置,Sharing Rule 有两个类型,一个是Ownership-based Sharing Rule,另外一个是 Critia-based Sharing Rule,这两种根据不同的场景使用不同的类型。入口均为Set Up处搜索 sharing settings 然后切换到某个具体的object以后,在Sharing Rule区域点击new即可。

在第二步我们可以选择owner-based还是criteria-based,下图demo中是基于owner-based,当lead这条记录的owner在清洗一组 Group情况下则会自动share给Group为清洗二组的用户,share的权限为Read。 Owner 除了可以选择Group以外,还可以选择Role/ Territory以及相关的选项。Criteria和Owner的区别为条件为当表中的字段满足什么情况下share给某个群组用户,比如当 Lead的质量较高情况下,share给sales operation团队去进行追踪。

需要注意的是,当share rule改变以后,原有的share关系便会移除,Salesforce在share关系理论上是读取 __Share表,不管是sharing rule还是manual share或者代码层面的写法都是生成 __Share表记录,比如针对 Lead表的share关系,会存储成 Lead__Share表去关联某个表针对某个group或者某个user拥有什么样的访问权限,当关系改变,Lead__Share相关记录也会自动移除。

六. Account/Opportunity/Case Team & 自定义表的team

在CRM中,一个大的客户一个大的业务机会通常由一个团队去协同合作最终去实现赢单,这个时候便有了team的概念。在salesforce中,account team以及opportunity team是经常用到的两个内容。

account / opportunity的owner通常可以添加一个或者多个人作为团队成员,针对某个account / opportunity 分配给他们不同的角色以及对数据的不同的访问权限。从而实现这些成员可以对这个account/opportunity进行操作和追踪。当然,这个理论上还是生成了 __Share的记录。 account/ opportunity team在salesforce中是一个related list存在于 account/opportunity级联列表。如果在account/opportunity找不到需要先将page layout中的级联列表拖出来。当然,大前提是salesforce 系统中已经enable account team,详情可以参看前面讲过的sales cloud的章节。

有时项目中会用到其他表的team概念,比如 Lead Team,这个时候我们只需要按照account team去copy一下新建一个 Lead_Team__c的表即可。 当新建一条Lead_Team__c数据关联一个user以后,代码生成一条 Lead__Share,说明一下RowCause即可。代码简单参考如下:

if(Trigger.isAfter && (Trigger.isInsert || Trigger.isUpdate)) {
List<LeadShare> leadShareList = new List<LeadShare>();
for(Lead_Team__c leadTeam : (List<Lead_Team__c>)Trigger.new) {
LeadShare sharedLead = new LeadShare();
sharedLead.LeadId = leadTeam.Lead__c;
sharedLead.LeadAccessLevel = leadTeam.Lead_Access__c == 'Read/Write' ? 'Edit' : 'Read';
sharedLead.RowCause = 'Manual';
sharedLead.UserOrGroupId = leadTeam.User__c;
leadShareList.add(sharedLead);
}
insert leadShareList;
}

代码生成的和Share的数据生成的好处有哪些呢?

  • 便于开发人员去追踪和追踪开发相关的share的问题;
  • 当owner或者其他条件改变以后,代码生成的share不会自动删除。

总结:篇中只是扫盲的介绍了一些salesforce中的一些权限管理以及share相关的基础知识,关于详细内容以及深入和加密相关的内容没有讲解,后期有机会在单独拿出一篇讲解。篇中有错误地方欢迎指出,有不懂欢迎留言。

Salesforce Sharing And Visibility 零基础学习(一)基础知识篇的更多相关文章

  1. [原]零基础学习视频解码之android篇系列文章

    截止今天,<零基础学习视频解码系列文章>.<零基础学习在Android进行SDL开发系列文章>以及<零基础学习视频解码之android篇>系列文章基本算是告一段落了 ...

  2. salesforce lightning零基础学习(二) lightning 知识简单介绍----lightning事件驱动模型

    看此篇博客前或者后,看一下trailhead可以加深印象以及理解的更好:https://trailhead.salesforce.com/modules/lex_dev_lc_basics 做过cla ...

  3. java基础学习总结——基础语法1

    一.标识符

  4. java基础学习总结——基础语法2

    一.语句

  5. JAVA基础学习day24--Socket基础一UDP与TCP的基本使用

    一.网络模型 1.1.OIS参考模型 1.2.TCP/IP参考模型 1.3.网络通讯要素 IP地址:IPV4/IPV6 端口号:0-65535,一般0-1024,都被系统占用,mysql:3306,o ...

  6. JAVA基础学习day23--GUI基础

    一.GUI概述 1.1.GUI概述 Graphical User Interface(图形用户接口) 用图形的方式,来显示计算机操作的界面, CLI: Command line User Interf ...

  7. Python基础学习Day7 基础数据类型的扩展 集合 深浅copy

    一.基础数据类型的扩展 1.1GBK ---> UTF - 8 # str --->bytes s1 = '太白' # 字符串是unicode编码 b1 = s1.encode('gbk' ...

  8. 2019-10-8:渗透测试,基础学习,php基础,会话,文件包含,笔记

    php面向对象基础->调用符号构造函数construct,主要用来创建对象时初始化对象,为成员变量赋初始值,总与new运算符一起使用在创建对象的语句中 析构函数destructor,与构造函数相 ...

  9. node基础学习——http基础知识-01-客户单请求

    <一> HTTP基础createServer()相关事件介绍 1. 创建HTTP服务器 server = http.createServer([requestListener]) // 下 ...

  10. Java基础学习之基础概念与环境搭建(1)

    1.Java基础概念 1.1.Java语言的特点 Java语言是简单易学的 Java语言是面向对象(封装.继承和多态) Java语言是平台无关的(一次编译,到处运行) Java语言是可靠的.安全的(异 ...

随机推荐

  1. 【BOOK】解析库—XPath

    XPath-XML Path Language 1.安装 lxml库 2.XPath常用规则 3.XPath解析页面 from lxml import etree text = ''' <div ...

  2. SpringMVC-nfjh

    SpringMVC springmvc项目创建 1.使用maven创建web项目结构 2.补充更改结构 3.springmvc-config.xml 1)添加包扫描(context命名空间) 2)添加 ...

  3. netty库包冲突问题

    参考 http://www.yayihouse.com/yayishuwu/chapter/1603 报错信息:Caused by: java.lang.NoSuchFieldError: netty ...

  4. bootstrap栅格系统,排版,代码,表格表单

    一.栅格系统 栅格系统用于通过一系列的行(row)与列(column)的组合来创建页面布局. 实例: <!DOCTYPE html> <html lang="zh-CN&q ...

  5. pintia 3-7-5 逆波兰表达式求值 (20 分)

    3-7-5 逆波兰表达式求值 (20 分) 逆波兰表示法是一种将运算符(operator)写在操作数(operand)后面 的描述程序(算式)的方法.举个例子,我们平常用中缀表示法描述的算式(1 + ...

  6. 003Java的诞生

    003Java的诞生 1.计算机语言发展史 (1)第一代语言 机器语言 我们都知道计算机的基本计算方式都是基于二进制的方式. 二进制:010111001010110010110100 这种代码是直接输 ...

  7. 3-XSS漏洞

    1.XSS原理 跨站脚本攻击是一种针对网站应用程序的安全漏洞攻击技术,是代码注入的一种.它允许恶意用户将代码注入网页,其他用户在浏览网页时会受到影响.恶意用户利用xss代码攻击成功后,可能得到很高的权 ...

  8. python学习记录(二)-特殊函数

    闭包函数 def outer(): var = 100 def inner(): nonlocal var var += 200 print(var) return inner res = outer ...

  9. Jmeter--请求结果写入文件并生成报告

    一.数据写入文件 Jmeter中监听器控件中,都可以将"所有数据写入一个文件",且文件形式有:xml\jtl\csv 在需要写入的监听器下点击"浏览"按钮,选择 ...

  10. loadrunner获取时间戳

    web_save_timestamp_param("tStamp", LAST);    //取时间戳