Публикация

Работа с правами на записи - возврат прав по умолчанию из скрипта C#

Добрый день! 

При работе с правами на объекты в бизнес процессе, возникла ситуация когда стало необходимо вернуть права на запись (Entity), согласно настройкам на странице "Права доступа на объекты" раздела, например Лид.  Для этого можно воспользоваться классом DBSecurityEngine, например так:

EntitySchema schema = UserConnection.EntitySchemaManager.FindInstanceByName("Lead");
UserConnection.DBSecurityEngine.AddDefRights(new Guid("Ваш уникальный идентификатор записи"), schema);

Но выяснилось что метод AddDefRights класса DBSecurityEngine дублирует уже имеющиеся записи в таблице прав SysLeadRight. 

Переопределив данный класс можно избежать этого поведения, например:

using System;
using Terrasoft.Core;
using Terrasoft.Core.Configuration;
using Terrasoft.Core.DB;
using Terrasoft.Core.Entities;
 
namespace Terrasoft.Core.DB
{
    class UsrDBSecurityEngine : DBSecurityEngine
    {
        public UsrDBSecurityEngine() : base()
        {
        }
 
		new
        public void AddDefRights(Guid primaryColumnValue, EntitySchema schema)
        {
            AddDefRights(primaryColumnValue, UserConnection.CurrentUser.Id, UserConnection.CurrentUser.ContactId, schema);
        }
 
		new
        public void AddDefRights(Guid primaryColumnValue, Guid userId, Guid contactId, EntitySchema schema)
        {
            if (!Guid.Empty.Equals(userId))
            {
                InsertSelect recordDefRightsInsert = GetRecordDefRightsInsert(userId, contactId, schema.UId, Guid.Empty, Guid.Empty, isNewRecord: false);
                if (recordDefRightsInsert != null)
                {
                    recordDefRightsInsert.Parameters.GetByName("RecordId").Value = primaryColumnValue;
                    recordDefRightsInsert.Execute();
                }
            }
        }
        protected override QueryCondition GetRecordsByRightConditionUseDenyRecordRights(RecordsByRightOptions options)
        {
            throw new NotImplementedException();
        }
        internal virtual InsertSelect GetRecordDefRightsInsert(Guid userId, Guid contactId, Guid schemaUId, Guid recordId, Guid ownerId, bool isNewRecord)
        {
            string text = FindEntitySchemaNameByUId(schemaUId);
            if (string.IsNullOrEmpty(text))
            {
                return null;
            }
            if (!GetIsEntitySchemaAdministratedByRecordsInternal(text))
            {
                return null;
            }
            if (GetSchemaUseOwnRecordRights(text))
            {
                QueryParameter userIdParameter = new QueryParameter("UserId", userId);
                QueryParameter schemaUIdParameter = new QueryParameter("SchemaUId", schemaUId);
                QueryParameter queryParameter = new QueryParameter("RecordId", recordId);
                QueryParameter queryParameter2 = new QueryParameter("ContactId", contactId);
                Query recordDefRightsSelect = GetRecordDefRightsSelect(userId, schemaUIdParameter);
                if (isNewRecord)
                {
                    recordDefRightsSelect.Union(GetRecordDefRightsSelectByOperation(userIdParameter, EntitySchemaRecordRightOperation.Read)).Union(GetRecordDefRightsSelectByOperation(userIdParameter, EntitySchemaRecordRightOperation.Edit)).Union(GetRecordDefRightsSelectByOperation(userIdParameter, EntitySchemaRecordRightOperation.Delete));
                }
/*Запрос который решает проблему дублирования записей в таблице прав*/
                Select notExists = new Select(UserConnection)
                    .Column(Column.Parameter(1))
                    .From("Sys"+ text+ "Right").As("str")
                    .Where("str", "RecordId").IsEqual(queryParameter)
                    .And("str", "SysAdminUnitId").IsEqual("DefRightsSelect", "GranteeSysAdminUnitId")
                    .And("str", "Operation").IsEqual("DefRightsSelect", "Operation") as Select;
                Query subSelectQuery = new Select(UserConnection).Column(queryParameter).As("RecordId").Column("GranteeSysAdminUnitId")
                    .As("GranteeSysAdminUnitId")
                    .Column("Operation")
                    .As("Operation")
                    .Column("RightLevel")
                    .As("RightLevel")
                    .Column("Position")
                    .As("Position")
                    .Column("SourceId")
                    .As("SourceId")
                    .Column(queryParameter2)
                    .Column(queryParameter2)
                    .From(recordDefRightsSelect)
                    .As("DefRightsSelect").Where("").Not().Exists(notExists); /*добавляем сюда проверку нашим запросом*/
                InsertSelect insertSelect = new InsertSelect(UserConnection).Into(GetRecordRightsSchemaName(text))
                    .Set("RecordId", "SysAdminUnitId", "Operation", "RightLevel", "Position", "SourceId", "CreatedById", "ModifiedById")
                    .FromSelect(subSelectQuery);
                insertSelect.InitializeParameters();
                return insertSelect;
            }
            return null;
        }
 
        internal virtual Select GetRecordDefRightsSelect(Guid userId, QueryParameter schemaUIdParameter)
        {
            return new Select(UserConnection).Column("GranteeSysAdminUnitId").Column("Operation").Column("RightLevel")
                .Column("Position")
                .Column(Column.Parameter(RecordRightSource.Def))
                .As("SourceId")
                .Column(Column.Parameter(1))
                .As("Priority")
                .From("SysEntitySchemaRecordDefRight")
                .Where("SubjectSchemaUId")
                .IsEqual(schemaUIdParameter)
                .And()
                .Exists(new Select(UserConnection).Column(Column.Const(1)).From("SysAdminUnitInRole").Where("SysAdminUnitInRole", "SysAdminUnitId")
                    .IsEqual(Column.Parameter(userId))
                    .And("SysAdminUnitInRole", "SysAdminUnitRoleId")
                    .IsEqual("SysEntitySchemaRecordDefRight", "AuthorSysAdminUnitId") as Select)
                .And("Position")
                .IsEqual(new Select(UserConnection).Column(Func.Min("MinRightPosition", "Position")).From("SysEntitySchemaRecordDefRight").As("MinRightPosition")
                    .Where("MinRightPosition", "SubjectSchemaUId")
                    .IsEqual(schemaUIdParameter)
                    .And()
                    .Exists(new Select(UserConnection).Column(Column.Const(1)).From("SysAdminUnitInRole").Where("SysAdminUnitInRole", "SysAdminUnitId")
                        .IsEqual(Column.Parameter(userId))
                        .And("SysAdminUnitInRole", "SysAdminUnitRoleId")
                        .IsEqual("MinRightPosition", "AuthorSysAdminUnitId") as Select)
                    .And("MinRightPosition", "GranteeSysAdminUnitId")
                    .IsEqual("SysEntitySchemaRecordDefRight", "GranteeSysAdminUnitId")
                    .And("MinRightPosition", "Operation")
                    .IsEqual("SysEntitySchemaRecordDefRight", "Operation")) as Select;
        }
 
        internal Select GetRecordDefRightsSelectByOperation(QueryParameter userIdParameter, EntitySchemaRecordRightOperation operation)
        {
            return new Select(UserConnection).Column(userIdParameter).As("GranteeSysAdminUnitId").Column(Column.Parameter((int)operation))
                .Column(Column.Parameter(2))
                .Column(Column.Parameter(0))
                .As("Position")
                .Column(Column.Parameter(RecordRightSource.Author))
                .As("SourceId")
                .Column(Column.Parameter(0))
                .As("Priority")
                .From("SysOneRecord")
                .As("CreatorDefRightsSelect");
        }
    }
}

Далее можно вызвать наш переопределенный метод так:

EntitySchema schema = UserConnection.EntitySchemaManager.FindInstanceByName("Lead");
UsrDBSecurityEngine usrDBSecurityEngine = new UsrDBSecurityEngine();
usrDBSecurityEngine.Initialize(UserConnection);
usrDBSecurityEngine.AddDefRights(new Guid("Ваш уникальный идентификатор записи"), schema);

Надеюсь кому-то поможет. 

Нравится

Поделиться

0 комментариев
Показать все комментарии