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