Salesforce 开发整理(三)权限共享

Salesforce提供对象的访问权限可以通过 安全性控制 → 共享设置,可以查看每个对象在系统内部默认的访问权限

  • 共用读写:对象的记录任何用户都可以进行读写操作
  • 公用只读:对象的记录任何用户都可以查看,但是只有记录所有人以及具有权限的用户可以编辑
  • 专用:对应的记录只有具有权限的用户才可以进行读写操作
  • 从父级控制:对象记录访问权限跟随父级

以Movie__c对象为例,此时对象权限为公用读写,看到的记录详情页面是这样的

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

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

通过共享按钮可以将记录共享给其他公用小组/用户/角色/角色及下属,访问级别提供了只读/读写两种级别。用户可以通过共享按钮来将记录的权限共享给其他用户用于查看或修改。

但是很多时候,我们更希望做到的是类似于记录能自动共享给一部分人的情况,比如记录上有一个查找用户字段,当记录被创建时,权限自动共享给该用户,该用户被修改后也能把之前的权限给到新用户并将权限从之前的用户身上收回。

我们在Movie__c对象上新建一个查找(用户)的字段,约会人Engagement__c

需求:当Movie__c记录被创建时,将记录读写权限共享给约会人

实现如下:

 1 trigger MovieTrigger on Movie__c (after insert,after update) {
 2     //触发器的实现类
 3     MovieTriggerHandler handler = new MovieTriggerHandler();
 4
 5     //当记录新建的时候触发
 6     if(trigger.isAfter && trigger.isInsert){
 7         Set<Id> Set_movieId = new Set<Id>();
 8         for(Movie__c movie:trigger.new){
 9             //记录约会人!=null 且 记录约会人!=记录所有人
10             if(movie.Engagement__c != null && movie.Engagement__c != movie.OwnerId){
11                 Set_movieId.add(movie.id);
12             }
13         }
14         //判断是否有符合条件的记录
15         if(Set_movieId.size() > 0) handler.shareWithPerson(Set_movieId);
16     }
17 }

然后是写触发器的实现类

 1 public class MovieTriggerHandler{
 2
 3    public void shareWithPerson(Set<Id> Set_movieId){
 4        //查询电影列表的记录
 5        List<Movie__c> list_movie = new List<Movie__c>([select id,OwnerId,Engagement__c from Movie__c where id=:Set_movieId]);
 6
 7        //存储共享记录列表
 8        List<Movie__Share> list_share = new List<Movie__Share>();
 9
10        for(Movie__c ml:list_movie){
11            Movie__Share share = new Movie__Share();
12            share.UserOrGroupId = ml.Engagement__c;//需要共享给的用户 or 小组
13            share.ParentId = ml.id;//记录id
14            share.AccessLevel = ‘edit‘; //edit:读写/read:只读
15            list_share.add(share);
16        }
17        //判断是否为空
18        if(list_share.size() > 0) insert list_share;
19    }
20 }

写完代码后,不要忘记启用触发器让它生效

此时创建一条数据,如果约会人存在且不等于所有人,则再次查看我们的共享列表就能看到类似如下的内容

这也就是通过代码实现的自动共享操作。

需要注意的有几个点:

  • 1.约会人不能为空
  • 2.约会人不能等于记录所有人
  • 3.约会人不能等于系统管理员
  • 4.约会人必须是被启用的用户
  • 5.当记录所有人被修改,共享过来的用户都会被清空掉,需要重新共享权限

重点看下第五条,通过共享按钮共享到的用户会随着记录所有人的变更,从共享列表中被清除,所以我们在触发器中需要根据这一点做好相关判断与处理

 1  //当记录修改的时候触发
 2     if(trigger.isAfter && trigger.isUpdate){
 3         Set<Id> Set_movieId = new Set<Id>();
 4         for(Movie__c movie:trigger.new){
 5             Movie__c oldMovie = trigger.oldMap.get(movie.id);
 6        //所有人发生变更且新记录约会人不等于空
 7             if(movie.OwnerId != oldMovie.OwnerId && movie.Engagement__c != null){
 8                 Set_movieId.add(movie.id);
 9             }
10         }
11         //判断是否又符合条件的记录
12         if(Set_movieId.size() > 0) handler.shareWithPerson(Set_movieId);
13     }

我们可以同样使用新建时候的逻辑,传递一个满足条件的Set集合到MovieTriggerHandler中的shareWithPerson方法中去,复用该方法。

这个问题在共享规则中是不存在的,用共享规则共享出去的权限不受记录所有人变更的影响。

那么在最后还有一点值得一提的是,如果字段约会人本身发生修改,在触发器中除了要共享给新的约会人以权限,也需要删除原约会人的记录

1 List<Movie__Share> plist = new List<Movie__Share>([select UserOrGroupId,ParentId,AccessLevel
2                      from Movie__Share where UserOrGroupId =‘movieId‘ and RowCause =: ‘Manual‘]);  //类型:手动共享

查询原约会人推荐加上对原因类型的判断,Manual即指代手动共享的类型,来自我们用共享按钮或Apex类的共享,从而有效避免查询的用户会有因其他原因具备查看该记录的权限结果被我们删除的情况。

Salesforce提供了相对简单的权限设置方法,层级的模式下,在共享的时候要尽可能减少能看到记录的用户数量,进而保证数据的安全性,最后,如有遗漏欢迎指正,有问题可以在评论区留言。

原文地址:https://www.cnblogs.com/luqinghua/p/9087912.html

时间: 2024-10-02 15:21:03

Salesforce 开发整理(三)权限共享的相关文章

Salesforce 开发整理(十)项目部署总结

项目部署顺序 全局值集 小组 自定义字段-对象-设置(SF1 紧凑布局要和记录类型在这里要一起部署) 邮件模板-静态资源 角色 工作流-流定义(包含进程生成器) 批准过程 开发部署<Apex类,页面,触发器,组件> 选项卡 视图 自定义按钮(链接) 布局-记录类型-操作<这仨绑定> 应用程序 文件夹,报表,自定义报表类型,仪表板 规则(重复/匹配/共享若干) 需要注意的地方 没有启用的仪表板,报表,批准过程,审批流等等,尽量不要部署到正式里面去 每次上载数据的时候把简档都带上一起&

Salesforce 开发整理(十一) 自定义放大镜查找效果

有时候在自定义的visualforce页面上,需要实现系统标准的查找样式,当不能使用标准的style的时候,我们只能选择自定义实现,下面分享一个demo,预览效果如下: 实现代码,Visualforce页面 1 <!-- 自定义放大镜查找效果 --> 2 <apex:page showHeader="false" controller="SelectSystem" standardStylesheets="false" side

零基础到CS开发高手通用权限管理系统全程实录

零基础到CS开发高手通用权限管理系统全程实录(Devexpress.FastReport.NET.WebService.智能客户端)课程讲师:闲筝课程分类:.NET框架适合人群:中级课时数量:70课时更新程度:80%用到技术:Devexpress.FastReport.NET.WebService.智能客户端涉及项目:通权系统.智能客户端.报表设计器咨询qq:1840215592 详细介绍:http://www.ibeifeng.com/goods-493.html项目主要功能模块:闲筝老师的.

HyperLeger Fabric开发(三)——HyperLeger Fabric架构

HyperLeger Fabric开发(三)--HyperLeger Fabric架构 一.HyperLeger Fabric架构简介 1.通道简介 商业应用的一个重要的需求是私密×××易,为此Fabric设计了通道(Channel)来提供成员之间的隐私保护.通道是部分网络成员之间拥有独立的通信渠道,在通道中发送的交易只有属于通道的成员才可见,因此通道可以看作是Fabric的网络中部分成员的私有通信子网.通道由排序服务管理.在创建通道的时候,需要定义通道的成员和组织.锚节点(anchor pee

微信开放平台 公众号第三方平台开发 教程三 一键登录授权给第三方平台

原文:微信开放平台 公众号第三方平台开发 教程三 一键登录授权给第三方平台 教程导航: 微信开放平台 公众号第三方平台开发 教程一 平台介绍 微信开放平台 公众号第三方平台开发 教程二 创建公众号第三方平台 微信开放平台 公众号第三方平台开发 教程三 一键登录授权给第三方平台 微信开放平台 公众号第三方平台开发 教程四 代公众号调用接口的SDK和demo 公众号第三方平台的开放,是为了让公众号运营者,在面向垂直行业需求时,可以一键登录授权给第三方的公众号运营平台,通过第三方开发者提供的公众号第三

Windows移动开发(三)——闭关修炼

上一次,我们了解了委托,委托和Lambda表达式结合是一件灰常灰常爽的事情,这也是只有.Net才有,自己偷着笑去吧.几天这次,我要介绍一下继承和多态,这是进行面向对象编程必须熟练掌握的技术和思想. 1.1 类 继承,儿子继承父亲的遗产,这是生活中的体现,在面向对象的编程中,父亲和儿子都是对象的抽象集合,也就是类.什么是类呢?就是一些具有共同特征的对象集合,例如:狗都有四条腿,一条尾巴,两只眼睛,狗都会游泳,都爱吃骨头,所以我们把具有以上特征的动物抽象成狗,我们进行面向对象编程也是这样,面向对象的

QT开发(三十四)——QT多线程编程

QT开发(三十四)--QT多线程编程 一.QT多线程简介 QT通过三种形式提供了对线程的支持,分别是平台无关的线程类.线程安全的事件投递.跨线程的信号-槽连接. QT中线程类包含如下: QThread 提供了开始一个新线程的方法    QThreadStorage 提供逐线程数据存储    QMutex 提供相互排斥的锁,或互斥量    QMutexLocker 是一个辅助类,自动对 QMutex 加锁与解锁    QReadWriterLock 提供了一个可以同时读操作的锁    QReadL

QT开发(三十五)——QT进程间通信

QT开发(三十五)--QT进程间通信 Qt 是一个跨平台的应用框架,其进程间通信机制当然可以使用所在平台的进程间通信机制,如在Windows平台上的Message机制.共享内存.文件映射.管道.Socket等.其中,Qt对一些许多平台共有的IPC机制进行了封装. 一.TCP/IP 其实就是通过网络模块实现的IPC.不过Qt对其进行了封装,并提供了两个层次的API,包括应用程序级的QNetworkAccessManager, QFtp等和底层的QTcpSocket, QTcpServer, QSs

QT开发(三十六)——Model/View框架

QT开发(三十六)--Model/View框架 一.Model/View框架简介 1.Model/View框架核心思想 Model/View框架的核心思想是模型(数据)与视图(显示)相分离,模型对外提供标准接口存取数据,不关心数据如何显示,视图自定义数据的显示方式,不关心数据如何组织存储. Model/View框架中数据与显示的分离,可以允许使用不同界面显示同一数据,也能够在不改变数据的情况下添加新的显示界面.为了处理用户输入,引入了委托(delegate).引入委托的好处是可以自定义数据项的渲