Salesforce 开发整理(三)权限共享
Salesforce提供对象的访问权限可以通过 安全性控制 → 共享设置,可以查看每个对象在系统内部默认的访问权限
- 共用读写:对象的记录任何用户都可以进行读写操作
- 公用只读:对象的记录任何用户都可以查看,但是只有记录所有人以及具有权限的用户可以编辑
- 专用:对应的记录只有具有权限的用户才可以进行读写操作
- 从父级控制:对象记录访问权限跟随父级
以Movie__c对象为例,此时对象权限为公用读写,看到的记录详情页面是这样的

而在编辑页面布局上看到“共享按钮”是被拉出来的状态

当我们将Movie__c的组织权限修改为专用,则记录页面显示如下

通过共享按钮可以将记录共享给其他公用小组/用户/角色/角色及下属,访问级别提供了只读/读写两种级别。用户可以通过共享按钮来将记录的权限共享给其他用户用于查看或修改。
但是很多时候,我们更希望做到的是类似于记录能自动共享给一部分人的情况,比如记录上有一个查找用户字段,当记录被创建时,权限自动共享给该用户,该用户被修改后也能把之前的权限给到新用户并将权限从之前的用户身上收回。
我们在Movie__c对象上新建一个查找(用户)的字段,约会人Engagement__c
需求:当Movie__c记录被创建时,将记录读写权限共享给约会人
实现如下:
trigger MovieTrigger on Movie__c (after insert,after update) {
//触发器的实现类
MovieTriggerHandler handler = new MovieTriggerHandler();
//当记录新建的时候触发
if(trigger.isAfter && trigger.isInsert){
Set<Id> Set_movieId = new Set<Id>();
for(Movie__c movie:trigger.new){
//记录约会人!=null 且 记录约会人!=记录所有人
if(movie.Engagement__c != null && movie.Engagement__c != movie.OwnerId){
Set_movieId.add(movie.id);
}
}
//判断是否有符合条件的记录
if(Set_movieId.size() > 0) handler.shareWithPerson(Set_movieId);
}
}
然后是写触发器的实现类
public class MovieTriggerHandler{
public void shareWithPerson(Set<Id> Set_movieId){
//查询电影列表的记录
List<Movie__c> list_movie = new List<Movie__c>([select id,OwnerId,Engagement__c from Movie__c where id=:Set_movieId]);
//存储共享记录列表
List<Movie__Share> list_share = new List<Movie__Share>();
for(Movie__c ml:list_movie){
Movie__Share share = new Movie__Share();
share.UserOrGroupId = ml.Engagement__c;//需要共享给的用户 or 小组
share.ParentId = ml.id;//记录id
share.AccessLevel = 'edit'; //edit:读写/read:只读
list_share.add(share);
}
//判断是否为空
if(list_share.size() > 0) insert list_share;
}
}
写完代码后,不要忘记启用触发器让它生效
此时创建一条数据,如果约会人存在且不等于所有人,则再次查看我们的共享列表就能看到类似如下的内容

这也就是通过代码实现的自动共享操作。
需要注意的有几个点:
- 1.约会人不能为空
- 2.约会人不能等于记录所有人
- 3.约会人不能等于系统管理员
- 4.约会人必须是被启用的用户
- 5.当记录所有人被修改,共享过来的用户都会被清空掉,需要重新共享权限
重点看下第五条,通过共享按钮共享到的用户会随着记录所有人的变更,从共享列表中被清除,所以我们在触发器中需要根据这一点做好相关判断与处理
//当记录修改的时候触发
if(trigger.isAfter && trigger.isUpdate){
Set<Id> Set_movieId = new Set<Id>();
for(Movie__c movie:trigger.new){
Movie__c oldMovie = trigger.oldMap.get(movie.id);
//所有人发生变更且新记录约会人不等于空
if(movie.OwnerId != oldMovie.OwnerId && movie.Engagement__c != null){
Set_movieId.add(movie.id);
}
}
//判断是否又符合条件的记录
if(Set_movieId.size() > 0) handler.shareWithPerson(Set_movieId);
}
我们可以同样使用新建时候的逻辑,传递一个满足条件的Set集合到MovieTriggerHandler中的shareWithPerson方法中去,复用该方法。
这个问题在共享规则中是不存在的,用共享规则共享出去的权限不受记录所有人变更的影响。
那么在最后还有一点值得一提的是,如果字段约会人本身发生修改,在触发器中除了要共享给新的约会人以权限,也需要删除原约会人的记录
List<Movie__Share> plist = new List<Movie__Share>([select UserOrGroupId,ParentId,AccessLevel
from Movie__Share where UserOrGroupId ='movieId' and RowCause =: 'Manual']); //类型:手动共享
查询原约会人推荐加上对原因类型的判断,Manual即指代手动共享的类型,来自我们用共享按钮或Apex类的共享,从而有效避免查询的用户会有因其他原因具备查看该记录的权限结果被我们删除的情况。
Salesforce提供了相对简单的权限设置方法,层级的模式下,在共享的时候要尽可能减少能看到记录的用户数量,进而保证数据的安全性,最后,如有遗漏欢迎指正,有问题可以在评论区留言。
Salesforce 开发整理(三)权限共享的更多相关文章
- Salesforce 开发整理(五)代码开发最佳实践
在Salesforce项目实施过程中,对项目代码的维护可以说占据极大的精力,无论是因为项目的迭代,还是需求的变更,甚至是项目组成员的变动,都不可避免的需要维护之前的老代码,而事实上,几乎没有任何一个项 ...
- Salesforce 开发整理(八)PDF打印相关
一:基础设置 Salesforce中的PDF页面本质上还是Visualforce[简称VF]页面,所以只需要给VF页面加上一个属性[renderAs="pdf"] 即可生成一个PD ...
- Salesforce 开发整理(一)测试类最佳实践
在Sales force开发中完善测试类是开发者必经的一个环节,代码的部署需要保证至少75%的覆盖率,那么该如何写好测试类呢. 测试类定义格式如下: @isTest private class MyT ...
- Salesforce 开发整理(十)项目部署总结
项目部署顺序 全局值集 小组 自定义字段-对象-设置(SF1 紧凑布局要和记录类型在这里要一起部署) 邮件模板-静态资源 角色 工作流-流定义(包含进程生成器) 批准过程 开发部署<Apex类, ...
- Salesforce 开发整理(四)记录锁定
如果一个对象的记录在满足某个条件的情况下,希望能对其进行锁定,即普通用户没有权限对其进行编辑操作,记录页面显示如下图 一般会在提交审批,或者项目进行到某个阶段的情况下,由后台进行判断要不要锁定记录,或 ...
- Salesforce 开发整理(九) 开发中使用的一些小技巧汇总[持续更新]
1.查询一个对象下所有字段 当需要查询一个对象所有字段进行复制或其他操作,可以使用一段拼接的语句来查询 String query = 'select '; for(String fieldApi : ...
- Salesforce 开发整理(七)配置审批流
salesforce提供了比较强大的可配置审批流功能,在系统中翻译为“批准过程”.所以需要配置审批时,选择创建 ——> 工作流和批准 ——> 批准过程,然后选择管理批准过程,选择需要配置 ...
- Salesforce 开发整理(二)报表开发学习
Salesforce提供了强大的报表功能,支持表格.摘要.矩阵以及结合共四种形式,本文探讨在站在开发的角度要如何理解报表. 一:查询报表基本信息报表在Sales force中是Report对象,基本的 ...
- Salesforce 开发整理(六) Visualforce分页
分页的实现总体上分真分页和假分页. 所谓真分页指页面上列出来的数据就是实际查询的数据,假分页则是无论页面上一次显示多少条记录,实际上后台已经加载了所有的记录,分页只是为了展示给用户查看.今天分享一个V ...
随机推荐
- 用pyenv管理Python多版本及下载加速方法--Mac上
原文:https://www.jianshu.com/p/91fc7ecc5e46 先大致介绍下pyenv的安装及配置流程.随后介绍加速下载方法 安装: brew install pyenv 配置 在 ...
- 【BZOJ4016】[FJOI2014]最短路径树问题(点分治,最短路)
[BZOJ4016][FJOI2014]最短路径树问题(点分治,最短路) 题面 BZOJ 洛谷 题解 首先把最短路径树给构建出来,然后直接点分治就行了. 这个东西似乎也可以长链剖分,然而没有必要. # ...
- DOM的回流和重绘(重排、重绘)
什么是DOM回流? 页面渲染时,我们对HTML结构简单的增删查改时,浏览器会对所有的dom进行重新排序,这就i是DOM回流,严重影响浏览器性能 DOM的回流和重绘: **DOM的回流**:当页面中元素 ...
- LinQ in 写法
有时候会碰到一个需求,又一堆id 1,2,3,4,循环遍历id再去数据库查不仅效率低,而且代码难看,可以用in来实现: string[] codes = item.ExamPaperCode.Spli ...
- python 排序 归并排序
算法思想 迭代法: 归并算法一共有两种思想,笼统的说,这两种思想的区别就在于一种不分割未排序的序列(直接将序列看为n个个数为1的子序列),这种称为---迭代法 直接从队头开始,两两合并为一个个数为2的 ...
- ES6-面向对象
1.老版的面向对象: function User(name,pass){ this.name=name; this.pass=pass; } User.prototype.showName=funct ...
- 在React中写一个Animation组件,为组件进入和离开加上动画/过度
问题 在单页面应用中,我们经常需要给路由的切换或者元素的挂载和卸载加上过渡效果,为这么一个小功能引入第三方框架,实在有点小纠结.不如自己封装. 思路 原理 以进入时opacity: 0 --> ...
- 记录下vue keep-alive IOS下无法保存滚动scroll位置的问题
最近 做的项目,遇到了一点小麻烦,就是我一个页面A页面是加载 列表数据 ,B页面是展示详细信息的.A进去B时,缓存A页面. 效果 做出来 后,缓存是缓存数据 了,但是当我A页面的列表数据 好多,要滚动 ...
- iOS7的十个更“佳”:简洁直观更受青睐
转自:http://www.25pp.com/news/news_27792.html iOS7自发布以来一直是褒贬不一,虽然苹果还只是发布了第二个测试版,但普通用户早已经在纠结到底该不该升级iOS7 ...
- Easypoi实现单模板生成多页wrod文档
EasyPoi可以很方便的通过一个word模板,然后通过填充模板的方式生成我们想要的word文档.但是碰到了一个单模板生成多页数据的场景,比如一个订单详情信息模板,但是有很多订单,需要导入到一 ...