如何用自定义安全性扩展DBContext (EF6.0的)



我实际上是在尝试用自定义用户安全扩展EF。

实际上,我的逻辑在它自己的独立函数中检查权限,该函数没有EF的实际上下文。但是,如果我可以将我的逻辑直接附加到DBContext,那就太好了,这样每个linq-Query都将被检查。

我已经找到了"IDbCommandInterceptor"接口,但这对我来说太晚了,因为我正在检查类型。

权限检查代码:

/// <summary>
    /// Checks if the current user have the given rights for the given permission 
    /// </summary>
    /// <param name="permittedType"></param>
    /// <param name="requiredPerm"></param>
    /// <returns></returns>
    private CheckResult CheckPermissionFor(Type permittedType, Permissions requiredPerm)
    {
        CheckResult Result = new CheckResult();
        String TypeName = permittedType.Name;
        EntityObjectInfo ObjInfo = (from info in BaseData.EntityInfos where info.Name == TypeName select info).FirstOrDefault();
        if (ObjInfo != null)
        {
            if (ObjInfo.IsSecurityEnabled)
            {
                //Getting all permissions from assinged userpermissions with the right objectname
                IEnumerable<EntityPermission> ObjPerms = Session.AssingedEntityPermissions.Where(f => f.PermittedObject.Name == TypeName);
                if (ObjPerms.Any())
                {
                    //Check if any permission have readonly rights or higher to load the obj
                    if (ObjPerms.Max(f => f.Permission) < requiredPerm)
                        Result.Messages.AddMessage("No permission to " + requiredPerm + " for " + TypeName, MessageType.Error);
                }
                else
                    Result.Messages.AddMessage("No permission for " + TypeName, MessageType.Error);
            }
        }
        else
            Result.Messages.AddMessage("Missing objectinfo for " + TypeName, MessageType.Error);        
        return Result;
    }

谢谢

一种方法是

  1. 从DbContext中派生你自己的上下文

  2. 在上下文的构造函数中使用某种LoggedOnUser。

  3. 实现权限检查getter的实体像这样

    public DbSet<ClientAddress> ClientAddresses
    { 
        get; //TODO add getting logic with checking permissions
        set;
    }
    
  4. 在部分类(上下文实体)上使用属性,因此您可以描述所需的权限

  5. 在模型中使用T4生成项。在那里你可以修改输出的。cs文件,所以在你的数据库中有了新的实体,你不需要重写所有的东西,目标3可以自动生成。

最新更新