salesforce零基础学习(一百一十八)Restrict Rule
本篇参考:
https://help.salesforce.com/s/articleView?id=sf.security_restriction_rule.htm&type=5
https://help.salesforce.com/s/articleView?id=sf.security_restriction_rule_examples.htm&type=5
作为salesforce从业人员,数据的权限管理是一个特别重要的内容。我们熟知的设置权限的方式就是先设置 OWD进行一下 high level的设置。然后通过 Role Hierarchy / Share Rule / Manual Share进行数据权限的扩充从而达到不同的场景下,不同的USER可以扩充他可以看到的数据范围。

当然,不同的公司需求也千变万化。以下是潜在的场景需求:
- MD关系的数据,针对某个 Role的客户,只希望master类型的数据通过sharing setting进行了权限的扩充,但是detail的数据还是只能看到各自own的。因为MD关系的权限设置是 control by parent,没法去限制detail的权限,这种开发时我们只能将 detail设置成 private,然后增加很多 sharing rule或者 manual share对大部分人进行数据权限共享而只是为了忽略一小部分。
- 一个表有很多的 record type,需求是希望指定用户(比如user的某个字段)只能看到某个record type的一些数据,其他数据不支持查看(列表/report等等)
当然,demo中只列举了两个简单场景,实际场景会更多更复杂。SF的权限管理是特别厉害的,但是仍然要记住有很多限制。我们可能通过一些 workaround solution解决了,比如 sharing rule等,但是我们要知道这些都是有数量限制的,随着业务的不断变动,触发了一些government limitation以后,我们这种还是一个好的方案吗? 现在salesforce针对这种类似的情形,增加了 restriction rule。
一. Restriction Rule概念和基础知识
简单来概括, Restriction Rule的目的是用来隐藏掉一部分基于之前的数据权限,保证满足 restriction rule的数据可以被 user看到,从而增强了salesforce的数据访问的权限。

通过上图我们可以看到这个功能很强大,当然,回想一下之前的 dynamic form / dynamic action等等强有力的功能,使用时必不可少的受制于他的 limitation,所以使用前我们需要先了解一下 restriction rule consideration。
1. classic 和lightning 都支持吗,所有的表都支持吗?
Answer: 只支持 lightning,classic环境不保证。所以如果项目是新项目,仅在 lightning下使用,那可以考虑,否则别给自己找坑。 不是所有的表都支持。
- custom objects,external objects, contracts, events, tasks, time sheets, and time sheet entries
2. Restriction Rule支持哪些 Feature? 或者说我从哪里可以直观的看到这个功能所产生的效果。
Answer: 以下的 feature 支持 Restriction Rule.
- List Views
- Lookups
- Related Lists
- Reports
- Search
- SOQL
- SOSL
这里需要提示几个注意事项,当然官方的consideration特别多,这里例举几个我们常用到的项。
- restriction rule创建以后,如果之前 search box搜索过相关的记录存在 shortcut,则search还是可以看到。如果最近浏览过记录,在 recently view的视图中还是可以看到。当然,当你点击这条记录的时候,会给你报错告诉你无法访问。
- 当user执行克隆操作时,如果这条记录的 lookup字段因为 restriction rule导致你无法访问情况下,克隆会报错。比如 order数据会关联 contract数据,如果contract因为restriction rule导致你无法访问,当你克隆 order时便会报错。
- Restriction Rule 不适用于 System Mode下代码运行的场景。
- Restriction Rule不适用于以下的这些权限场景: View All, Modify All, View All Data, and Modify All Data.
- 尽管一条记录因为 restriction rule导致了没法查看,但是我们没法通过 UserRecordAccess这个表来确定。举个例子,某个user针对一条数据拥有权限,但是restriction rule给它限制住了访问。尽管这条记录访问不到,但是 UserRecordAccess却会显示对这条数据有权限。所以后续碰到对某条记录没有权限但是 UserRecordAccess却可以展示有访问权限的场景下,可以先查询 Restriction Rule作为快速排查。
二. Demo
我们创建了一个 Demo Object的custom object,包含两个 record type: Sample 1 & Sample 2. 我们在这个表设置了一个 restriction rule,当 user的 Role为 Installation & Repair Services情况下,只能查看 Record Type 为 Sample 1的数据。

我们可以看到Demo Object的 OWD设置的是 Public Read Only.

我们创建了4条数据,两条 sample1的,两条 sample 2的,针对system admin的数据,我们可以看到4条数据。

针对demo user,设置了他的 role为 Installation & Repair Services,可以看到尽管OWD设置的是 Public Read Only,但是因为restriction rule的影响,只能看到 sample 1的数据。

这里做一下 自定义逻辑的补充,我们通过lwc组件展示restriction rule的影响。
Demo_ObjectController.cls
public with sharing class Demo_ObjectController {
@AuraEnabled(cacheable=true)
public static List<Demo_Object__c> getAllList() {
List<Demo_Object__c> demoObjectList = [SELECT Id, Name
FROM Demo_Object__c
LIMIT 50000];
return demoObjectList;
}
}
demoObjectList.html
<template>
<lightning-datatable
data={datas}
columns={columns}
key-field="Id"
>
</lightning-datatable>
</template>
demoObjectList.js
import { LightningElement, track, wire } from 'lwc';
const columns = [
{ label: 'Name', fieldName: 'Name', type: 'text' }
];
import getAllList from '@salesforce/apex/Demo_ObjectController.getAllList';
export default class demoObjectList extends LightningElement {
columns = columns;
@track datas;
@wire(getAllList)
getAllList({ error, data }) {
if(data) {
this.datas = data;
} else if(error) {
//TODO
console.log(JSON.stringify(error));
}
}
}
通过demo user访问以后的效果:
with sharing是遵循 restriction rule的

将代码改成 without sharing,会发现所有的数据都可以搜索出来。

我们再用 UserRecordAccess这个表进行一下验证。
尽管UI上demo user访问不了sample 2的数据(下图是管理员用户查看的数据)

但是通过UserRecordAccess是可以访问到的。(下图是demo user id进行的查询展示)

这个其实是一个很危险的行为,不知道后续salesforce是否会增强。因为后续我们自定义的list view如果使用了 without sharing并且进行一些filter,结果集可能获取到的是超过restriction限制的数据,因为code的SOQL是 system mode, restriction rule没法生效。结果集搜索出来点击跳转到详情可能 list展示了,但是点击报错,用户行为极其不友好,并且没法通过 UserRecordAccess去实际的判断是否拥有权限,所以如果项目中有用到 restriction rule情况并且有自定义 list view,建议先将 restriction rule的条件和过滤的结果集也在后台看着过滤一下,避免造成不必要的影响。
总结:从功能来看,restriction rule对于权限控制又提升了特别多,也可以优化很多曾经各种绕来绕去的设计(针对一小部分特殊user的特殊访问)。使用前多看一下 consideration多测试。篇中有错误地方欢迎指出,有不懂欢迎留言。
salesforce零基础学习(一百一十八)Restrict Rule的更多相关文章
- salesforce 零基础学习(六十八)http callout test class写法
此篇可以参考: https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_classes_restfu ...
- salesforce 零基础学习(四十八)自定义列表分页之Pagination基类封装 ※※※
我们知道,salesforce中系统标准列表页面提供了相应的分页功能,如果要使用其分页功能,可以访问http://www.cnblogs.com/zero-zyq/p/5343287.html查看相关 ...
- salesforce 零基础学习(五十八)通过sObject的field返回其对应的基础类型
项目中有时候会要求通过sObject的Field的type类型返回其对应的基本类型,然后对其进行相关的处理,创建sObject的field可以选择的type类型是固定多的. 上述类型可以转换成几种基本 ...
- salesforce 零基础学习(三十八)Translate 的使用(国际化处理)
本篇参考:http://resources.docs.salesforce.com/200/17/en-us/sfdc/pdf/salesforce_workbench_cheatsheet.pdf ...
- salesforce 零基础学习(二十八)使用ajax方式实现联动
之前的一篇介绍过关于salesforce手动配置关联关系实现PickList的联动效果,但是现实的开发中,很多数据不是定死的,应该通过ajax来动态获取,本篇讲述通过JavaScript Remoti ...
- salesforce零基础学习(七十八)线性表链形结构简单实现
前两篇内容为栈和队列的顺序结构的实现,栈和队列都是特殊的线性表,线性表除了有顺序结构以外,还有线性结构. 一.线性表的链形结构--链表 使用顺序存储结构好处为实现方式使用数组方式,顺序是固定的.所以查 ...
- salesforce 零基础学习(五十二)Trigger使用篇(二)
第十七篇的Trigger用法为通过Handler方式实现Trigger的封装,此种好处是一个Handler对应一个sObject,使本该在Trigger中写的代码分到Handler中,代码更加清晰. ...
- salesforce 零基础学习(二十二)Test简单使用
本篇内容只是本人简单的mark开发中常出现的一些疑问,方便后期项目使用时奠定基础,如果对Test零基础童鞋,欢迎查看Test官方的使用介绍: https://help.salesforce.com/a ...
- salesforce 零基础学习(二十)简单APP制作
本篇参考链接:https://developer.salesforce.com/trailhead/project/salesforce_developer_workshop 本篇讲述的是最简单的AP ...
- salesforce 零基础学习(二十四)解析csv格式内容
salesforce中支持对csv格式的内容批量导入,可以使用dataloader,然而有些情况下,当用户没有相关权限使用dataloader导入情况下,就的需要使用VF和apex代码来搞定. 基本想 ...
随机推荐
- 【问题解决】Alpine镜像中执行jstack、arthas等命令提示Unable to get pid of LinuxThreads manager thread
问题现象 最近在处理项目上问题发现之前同事构建的AlpineLinux的镜像不能执行jstack等JDK命令,报错如下. Unable to get pid of LinuxThreads manag ...
- Lua5.4源码剖析:二. 详解String数据结构及操作算法
概述 lua字符串通过操作算法和内存管理,有以下优点: 节省内存. 字符串比较效率高.(比较哈希值) 问题: 相同的字符串共享同一份内存么? 相同的长字符串一定不共享同一份内存么? lua字符串如何管 ...
- 从解析HTML开始,破解页面渲染时间长难题
摘要:在本文中,将重点关注网页的初始渲染,即它从解析 HTML 开始. 我将探索可能导致高渲染时间的问题,以及如何解决它们. 本文分享自华为云社区<页面首屏渲染性能指南>,作者:Ocean ...
- Pytorch从0开始实现YOLO V3指南 part3——实现网络前向传播
本节翻译自:https://blog.paperspace.com/how-to-implement-a-yolo-v3-object-detector-from-scratch-in-pytorch ...
- 练习-使用日期时间相关的API ,计算出一个人已经出生了多长时间
程序分析:(1)使用Scanner类获取出生日期(2)使用DataFormat类中的方法parse,把字符串的出生日期解析为Data格式的出生日期(3)把Data格式的出生日期转化为毫秒值(4)获取当 ...
- IDEA的项目结构和IDEA的HelloWord
IDEA首次驱动 1. 选择不导入任何设置,点击 OK 2. 选择 Create New Project 3. 点击 new 按钮,配置安装的 JDK9 版本 选择 JDK9 目录,点击确定 4. 不 ...
- STM32与物联网01-ESP8266基本操作
ESP8266物联网简介 ESP8266简介 ESP8266 是上海乐鑫公司开发的一款具有 WiFi 功能的控制芯片,它带有完整的 TCP/IP 协议栈,因此可以用作物联网开发. ESP8266 本身 ...
- 2022-07-09 第六组 润土 CSS学习笔记
HTML:用来描述网页的一种语言. 超文本语言.动画.音频.视频.特效.超链. 用标签定义网页 浏览器 流行浏览器: IE微软宣布永久关闭 firefox火狐 Chrom谷歌 Sarifi vscod ...
- 第k小 来源:牛客网
题目 链接:https://ac.nowcoder.com/acm/contest/28886/1003 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K, ...
- N皇后的位运算有感
N皇后很明显是一个NP-Hard问题,如果n足够大的话,在有限较短的时间内是很难得出答案的,但是注意到N皇后(笔者认为这类问题称为棋盘问题更为贴切),在n*n棋盘之上,每个点有且只有两种状态,这与电脑 ...