ASP.NET Boilerplate:四眼原理的最佳解决方案是什么

时间:2017-09-26 11:21:53

标签: aspnetboilerplate

我想在ASP.NET Boilerplate框架中添加4眼原则。这意味着在应用于系统之前,角色,用户等的每个更改都需要(由另一个管理员)批准。我搜索了一段时间但没有回答。那么这个流程的最佳解决方案是什么?

我可以使用Abp表(dbo.AbpUser_Temp等)创建相同的表,并且所有更改都将存储在这些表中吗?有没有更好的解决方案?

示例:在应用程序中,Admin1创建了一个名为User1的用户。但是,在Admin2批准之前,此用户无法登录该应用程序。

2 个答案:

答案 0 :(得分:7)

简单工作流程

  

示例:在应用程序中,Admin1创建了一个名为User1的用户。但是,在Admin2批准之前,此用户无法登录该应用程序。

这些简单的工作流程可以通过属性和方法适当地处理:

["test","test2"]

复杂工作流程

像“每次更改”这样的复杂工作流程可以执行此操作而不是public class User : AbpUser<User> { public bool IsApproved { get; set; } public void Approve(User approver) { if (approver.Id != CreatorUserId) { IsApproved = true; } } } 表:

_Temp

用法:

public abstract class ChangeBase : Entity<long>, IExtendableObject
{
    public string EntityTypeAssemblyQualifiedName { get; set; }

    public string EntityIdJsonString { get; set; }

    public long ProposerUserId { get; set; }

    public long? ApproverUserId { get; set; }

    public string ExtensionData { get; set; }
}

public class Change : ChangeBase
{
    [NotMapped]
    public Type EntityType => Type.GetType(EntityTypeAssemblyQualifiedName);

    [NotMapped]
    public object EntityId => JsonConvert.DeserializeObject(EntityIdJsonString, EntityHelper.GetPrimaryKeyType(EntityType));

    [NotMapped]
    public bool IsApproved => ApproverUserId.HasValue && ApproverUserId != ProposerUserId;

    [NotMapped]
    public IDictionary<string, string> ChangedPropertyValuePairs => JObject.Parse(ExtensionData).ToObject<Dictionary<string, string>>();

    public Change(EntityIdentifier changedEntityIdentifier, long proposerUserId, IDictionary<string, string> changedPropertyValuePairs)
    {
        EntityTypeAssemblyQualifiedName = changedEntityIdentifier.Type.AssemblyQualifiedName;
        EntityIdJsonString = changedEntityIdentifier.Id.ToJsonString();
        ProposerUserId = proposerUserId;
        ExtensionData = JObject.FromObject(changedPropertyValuePairs).ToString(Formatting.None);
    }

    public bool Approve(long approverUserId)
    {
        if (approverUserId != ProposerUserId)
        {
            ApproverUserId = approverUserId;
            return true;
        }

        return false;
    }
}

答案 1 :(得分:2)

发展

  1. 分隔升级和生产环境。在一个盒子上开发,测试它,检查它然后部署到生产箱。简单,有效且与语言无关的建议。
  2. 由于ASP.NET Boilerplate框架包含Entity Framework。您还可以利用迁移。

    1. 完成开发工作并要求您更新数据库&#34;之后,您的SOP应该让管理员审核将要提交的(相对简单的)迁移。
    2. 我希望有所帮助。

      申请流程

      可能有很多方法可以实际实现这一点,所以我将介绍一个简单的方法,让您的想法流畅,但请记住:实现两个人完整性所需的方式必须符合你的操作程序应该有效,而不是相反。开发不会推动业务运营,业务用例推动开发。

      1. 扩展现有的30 * 24 * 3600课程。示例:Identity*类(可能以不同的名称命名,但它派生自ApplicationUser

        • 创建必须的2个标志(布尔字段),并且只能打开&#39; on&#39;由管理员
        • 单个管理员只能打开1个标志。 (这意味着您还必须存储哪个管理员打开了哪个标志。)
        • 标志可以存储在现有的IdentityUser表中,也可以创建新表
        • 添加逻辑,以便不允许用户登录,除非这两个标志都已打开。
        • 示例:Abp*已识别并注册,但无法登录。管理员同时切换标志后,将用户default IdentityUserRole提升为允许登录的角色