Dynamic CRM根据安全角色过滤用户可见的视图

发布时间 2023-09-27 14:11:20作者: 江渔湖

1.编写插件

  1 using Microsoft.Xrm.Sdk;
  2 using Microsoft.Xrm.Sdk.Messages;
  3 using Microsoft.Xrm.Sdk.Query;
  4 using System;
  5 using System.Collections.Generic;
  6 using System.Linq;
  7 using System.Text;
  8 using System.Threading.Tasks;
  9 
 10 namespace Foton.CRM.Plugin.KDClaim
 11 {
 12     /// <summary>
 13     /// 根据安全角色过滤用户可见的视图
 14     /// </summary>
 15     public class ViewRetrieve : IPlugin
 16     {
 17         /// <summary>
 18         /// 根据权限判断所展示的视图
 19         /// </summary>
 20         /// <param name="serviceProvider"></param>
 21         /// <exception cref="NotImplementedException"></exception>
 22         public void Execute(IServiceProvider serviceProvider)
 23         {
 24             IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
 25             IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
 26             IOrganizationService service = serviceFactory.CreateOrganizationService(null);
 27 
 28             if (context.Depth > 1)
 29                 return;
 30 
 31             try
 32             {
 33                 #region 获取实体信息
 34                 RetrieveEntityRequest request;
 35                 RetrieveEntityResponse response;
 36                 int? otc = -1;
 37 
 38                 request = new RetrieveEntityRequest()
 39                 {
 40                     LogicalName = "实体名"
 41                 };
 42                 response = (RetrieveEntityResponse)service.Execute(request);
 43                 otc = response.EntityMetadata.ObjectTypeCode.Value;
 44                 #endregion
 45 
 46                 #region 获取用户角色
 47                 Guid currentUserId = context.UserId;
 48                 EntityCollection userRoles = UserRoleTool.GetCurrentUserRoles(currentUserId, service);
 49 
 50                 UserModel user = new UserModel();
 51                 foreach (Entity roleItem in userRoles.Entities)
 52                 {
 53                     if (roleItem.Attributes.Contains("name") && roleItem.GetAttributeValue<string>("name") == "用户角色1")
 54                         user.isRole1 = true;
 55                     if (roleItem.Attributes.Contains("name") && roleItem.GetAttributeValue<string>("name") == "用户角色2")
 56                         user.isRole2 = true;
 57                     if (roleItem.Attributes.Contains("name") && roleItem.GetAttributeValue<string>("name") == "用户角色3")
 58                         user.isRole3 = true;
 59                     if (roleItem.Attributes.Contains("name") && roleItem.GetAttributeValue<string>("name") == "用户角色4)
 60                         user.isRole4 = true;
 61                 }
 62                 #endregion
 63 
 64                 #region 获取视图信息
 65                 QueryExpression queryExpression = new QueryExpression("savedquery")
 66                 {
 67                     ColumnSet = new ColumnSet(true),
 68                 };
 69                 queryExpression.Criteria.AddCondition("name", ConditionOperator.In, "视图1", "视图2", "视图3", "视图4", "快速查找可用视图");
 70                 DataCollection<Entity> entities = service.RetrieveMultiple(queryExpression).Entities;
 71 
 72                 Dictionary<string, Guid> dic_views = new Dictionary<string, Guid>();
 73                 foreach (Entity this_entity in entities)
 74                 {
 75                     dic_views.Add(this_entity["name"].ToString(), this_entity.Id);
 76                 }
 77                 #endregion
 78 
 79                 #region 设置视图权限
 80                 queryExpression = (QueryExpression)context.InputParameters["Query"];
 81                 FilterExpression filterExpression = queryExpression.Criteria.AddFilter(LogicalOperator.Or);
 82 
 83                 int? returnedTypeCode = null;
 84                 foreach (var conditionExpression in queryExpression.Criteria.Conditions)
 85                 {
 86                     if (conditionExpression.AttributeName == "returnedtypecode")
 87                         returnedTypeCode = (int)conditionExpression.Values[0];
 88                 }
 89 
 90                 if (returnedTypeCode == null)
 91                     return;
 92                 else if (returnedTypeCode == otc)
 93                     if (user.isRole1)
 94                     {
 95                         filterExpression.AddCondition("savedqueryid", ConditionOperator.Equal, dic_views["视图1"]);
 96                     }    
 97                     if (user.isRole2)
 98                     {
 99                         filterExpression.AddCondition("savedqueryid", ConditionOperator.Equal, dic_views["视图2"]);
100                         filterExpression.AddCondition("savedqueryid", ConditionOperator.Equal, dic_views["(视图4"]);
101                     }      
102                     if (user.isRole3)
103                     {
104                         filterExpression.AddCondition("savedqueryid", ConditionOperator.Equal, dic_views["视图3"]);
105                     }
106 
107                     filterExpression.AddCondition("savedqueryid", ConditionOperator.Equal, dic_views["快速查找可用视图"]);
108                 }
109                 else//其他实体
110                     return;
111                 #endregion
112 
113             }
114             catch (Exception ex) 
115             {
116                 new InvalidOperationException("插件出错!错误原因:" + ex.Message);
117             }
118 
119         }
120 
121     }
122 }

2.注册插件:

  需要注册在实体savedquery下,注册RetrieveMultiple方法执行之前