我实际上是在尝试用自定义用户安全扩展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;
}
谢谢
一种方法是
-
从DbContext中派生你自己的上下文
-
在上下文的构造函数中使用某种LoggedOnUser。
-
实现权限检查getter的实体像这样
public DbSet<ClientAddress> ClientAddresses { get; //TODO add getting logic with checking permissions set; }
-
在部分类(上下文实体)上使用属性,因此您可以描述所需的权限
-
在模型中使用T4生成项。在那里你可以修改输出的。cs文件,所以在你的数据库中有了新的实体,你不需要重写所有的东西,目标3可以自动生成。