【问题标题】:Kentico staging module - how can I prevent role synchronisation removing users from roles at target serverKentico 登台模块 - 如何防止角色同步从目标服务器上的角色中删除用户
【发布时间】:2016-02-19 00:23:57
【问题描述】:

我已经向 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 事件处理程序以某种方式防止用户被删除。

【问题讨论】:

    标签: asp.net kentico


    【解决方案1】:

    我刚刚发现了另外一个属性,根据描述,它应该可以满足您的需求:

    UserRoleInfo.TYPEINFO.IncludeToSynchronizationParentDataSet = false;
    

    【讨论】:

    • 感谢 Roman,我刚刚对此进行了测试,不幸的是它并没有改变我所描述的行为。羞耻,因为它看起来很有希望!仅供参考,该属性使用枚举,因此语法是 UserRoleInfo.TYPEINFO.IncludeToSynchronizationParentDataSet = IncludeToParentEnum.None
    • 这个属性应该可以工作,你确定初始化代码执行了吗?另外,如果您当前使用仍然保留此行,请尝试删除它:UserRoleInfo.TYPEINFO.LogSynchronization = CMS.DataEngine.SynchronizationTypeEnum.None;
    【解决方案2】:

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

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

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

    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() 方法或创建您自己的方法,然后只记录您想要记录的同步任务。

    但是,在您能够实施此操作之前,作为一种快速解决方法,您还可以按对象 > 全局对象 > 管理 > 用户过滤同步日志任务,并在将它们分阶段之前删除所有这些任务。

    【讨论】:

    • 感谢您的详细解答。恐怕您的快速修复不起作用,因为导致问题的暂存任务是角色任务。我确实想同步角色,我只是不希望此同步删除目标用户。关于您的其他答案,我不确定您的假设是否正确。没有记录用户任务。我相信这是因为用户角色关联是角色数据模型的一部分。无论如何,我真的想避免在后台定制 Kentico——我的问题需要一个面向未来的解决方案。不过,感谢您的宝贵时间。
    猜你喜欢
    • 2019-07-04
    • 2019-10-31
    • 2021-10-19
    • 2021-07-16
    • 1970-01-01
    • 1970-01-01
    • 2021-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多