Разработка
29
Окт
0

Ограничение модели безопасности на стороне сервера

Хотя система CRM обеспечивает достаточно богатую стандартную модель безопасности, часто при внедрении CRM системы приходится прибегать к различным надстройкам (плагинами/скриптами), которые проверяют Пользователя/Рабочую группу/Подразделение или какие-либо другие параметры и что-то разрешают или запрещают. И обычно все это выглядит кривовастенько 🙂 и усложняет архитектуру системы.

При этом CRM позволяет в определенных граница динамически переопределять стандартную модель безопасности. Каждый раз, когда пользователь обращается к записи какого-либо объекта, CRM система использует метод RetrievePrincipalAccess, чтобы определить какие полномочия на эту запись он имеет. Посмотрим, как их переопределить…

Предположим, что у пользователя есть права на редактирование всех Возможных сделок. При этом в зависимости от каких-либо условий, нужно запретить ему редактировать карточки.

  • Создайте плагин с таким кодом:
    using System;
    using System.Collections.Generic;
    using Microsoft.Xrm.Sdk;
    using Microsoft.Crm.Sdk.Messages;
    
    namespace SecurityModel
    {
        public class SecurityModel : IPlugin
        {
            public void Execute(IServiceProvider serviceProvider)
            {
                IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
                IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
                IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
    
                // Тут какая-то бизнес-логика
    
                AccessRights accessRights =
                    AccessRights.ReadAccess | 
                    AccessRights.AppendAccess | 
                    AccessRights.AppendToAccess;
                context.OutputParameters["AccessRights"] = accessRights;
            }
        }
    }
    

    Здесь ничего особенного не происходит, просто на выходе пользователю выдаются права только на чтение записи (а также на Добавление и Добавление к). В реально ситуации нужно добавить какие-то условия 🙂

  • Зарегистрируйте плагин в CRM:
    • Сообщение RetrievePrincipalAccess;
    • Объект Возможной сделки (для данного примера);
    • Стадия Пост;
    • Синхронно.

В результате, после открытия карточки Возможной сделки она будет доступна только для чтения.

З.Ы. К сожалению такой маневр не работает в обратную сторону. Допустим у пользователя нет прав на редактировании определенной Возможной сделки. Если описанным выше методом «выдать» ему права, то при открытии карточки запись будет доступна для редактирования, но при попытке сохранить система все равно скажет, что нет прав на запись.



Комментарии (0)

*

code