Kentico临时模块 - 如何防止角色同步将用户从目标服务器

时间:2016-02-18 12:23:32

标签: asp.net kentico

我已经用Kentico devnet和Kentico的支持提出了这个问题,并且还没有得到解决方案。我希望更广泛的SO社区能够提出一些建议。

供参考,这是devnet线程:http://devnet.kentico.com/questions/content-staging-how-can-i-stage-role-changes-but-ignore-user-changes

总而言之,我正在使用Kentico构建一个大型多站点Web平台。登台模块配置为通过从开发到UAT以及生产的线性环境链来部署Kentico对象更改。这些环境中的每一个自然具有不同的用户集。因此,我从登台过程中排除了用户和用户角色关系,如下所示:

public class KingspanUserEvents : CMSLoaderAttribute
{
    public override void Init()
    {
        UserInfo.TYPEINFO.LogSynchronization = CMS.DataEngine.SynchronizationTypeEnum.None;
        UserRoleInfo.TYPEINFO.LogSynchronization = CMS.DataEngine.SynchronizationTypeEnum.None;
    }
}

但是,我发现当更改的角色记录为暂存任务时,部分序列化角色数据是其用户关联。请记住,这些用户将是仅存在于源环境中的用户。

这样可以在同步环境时,在目标上更新角色,并从角色中删除所有用户。

Kentico支持说"我们已经意识到这一点,它已列入未来的改进名单。"。然而,对我来说,这是CMS的一个根本缺陷,它具有企业愿望。未能在应用程序体系结构(角色)和实时数据(用户)之间保持分离意味着我无法为应用程序的核心部分创建可靠的部署。

所以我的问题是,有没有人找到解决这个问题的方法?我想知道是否有可能挂钩StagingEvents.ProcessTask.Before事件处理程序以某种方式阻止用户被删除。

2 个答案:

答案 0 :(得分:1)

我刚刚找到了另外一个属性,根据描述,它应该按照您的要求进行:

UserRoleInfo.TYPEINFO.IncludeToSynchronizationParentDataSet = false;

答案 1 :(得分:0)

  

但是,我发现当更改的角色被记录为登台任务时,部分序列化角色数据就是其用户关联。

我认为这是因为RoleInfoProvider.SetRoleInfo()在内部将UserInfo更改记录为暂存任务,无论它是否实际对这些用户进行了更改。

您可以看到的是更改SaveRole()中的/CMSModules/Membership/Controls/Roles/RoleEdit.ascx方法:

private void SaveRole(RoleInfo ri, string codeName, string displayName)
{
    bool newRole = false;
    // Get object
    if (ri == null)
    {
        ri = RoleInfoProvider.GetRoleInfo(ItemID);
        if (ri == null)
        {
            ri = new RoleInfo();
            // indicate this is new role and should be redirected after safe
            newRole = true;
        }
    }

    if (ri.DisplayName != displayName)
    {
        // Refresh a breadcrumb if used in the tabs layout
        ScriptHelper.RefreshTabHeader(Page, string.Empty);
    }

    // Set the fields
    ri.DisplayName = displayName;
    ri.RoleName = codeName;
    ri.RoleID = ItemID;
    ri.Description = txtDescription.Text;
    ri.SiteID = mSiteId;
    ri.RoleIsDomain = chkIsDomain.Checked;

    // If group id is present then it's group role
    if (GroupID > 0)
    {
        ri.RoleGroupID = mGroupId;
        ri.RoleIsGroupAdministrator = chkIsAdmin.Checked;
    }


    RoleInfoProvider.SetRoleInfo(ri);
    ItemID = ri.RoleID;

    ShowChangesSaved();

    // if new group was created redirect to edit page
    if (newRole)
    {
        RoleID = ri.RoleID;
        RaiseOnSaved();
    }
}

这是在CMSSiteManager中单击“保存”时调用的方法。请记住我在这里使用的是版本7,因此在v8和9中可能会略有不同,但如果在这些版本中使用不同的控件,您可以始终“查看帧源”以确定正在加载的ASPX页面Kentico UI中的控件。

无论如何,在该方法中,正在调用RoleInfoProvider.SetRoleInfo()。您可以看到的一件事是creating a custom InfoProvider class并覆盖SetRoleInfo()方法或创建自己的方法,然后只记录您要记录的同步任务。

但是,作为快速修复,直到您能够实现此功能,您还可以按对象&gt;过滤同步日志任务。全球对象&gt; <给药>用户在删除之前删除所有这些任务。