gpt4 book ai didi

c# - 保护/省略 NHibernate 中域实体的选定属性(子类、投影、?)

转载 作者:行者123 更新时间:2023-11-30 21:19:47 24 4
gpt4 key购买 nike

考虑以下简化场景:

public class Person
{
public string Name { get; set; }

public int Age { get; set; }

// restricted
public string SocialSecurityNumber { get; set; }

// restricted
public string MothersMaidenName { get; set; }
}

因此,在应用程序中,许多用户可以查看Person 数据。部分用户可以查看全部;其他用户只能查看 NameAge

让 UI 仅显示授权数据在客户端很容易,但我什至不想将该数据发送给客户端。

我试图通过创建一个 FullPerson : BasicPerson 层次结构(每个类层次结构一个表)来实现这一点。我使用了 StaffRepository 的两个实现来获得所需的类型,但由于 NH 代理,必要的转换在运行时失败了。当然,在 RDBMS 中,People 表中的任何给定行都可以代表一个 FullPerson 或一个 BasicPerson,并且为它们提供相同的鉴别器值也不行。

我考虑过仅映射 FullPerson 并使用 AliasToBean 结果转换器过滤到 BasicPerson,但我认为这是一种单向的方式街道,而我希望在 session 中充分利用实体管理和延迟加载(尽管上面的示例不包括集合)。

我的另一个想法是将所有受限字段包装到一个类中并将其添加为属性。我对这种方法的担忧有几个:

  1. 它破坏了我的领域模型,
  2. 我必须将该属性声明为一个集合(始终为 1)以便延迟加载它,并且
  3. 我什至不确定如何阻止加载惰性集合。

这一切感觉都不对。是否有已知的方法来实现预期的结果?

说明:

这在仅限 Intranet 的桌面应用程序中; session 存在于客户端。虽然我当然可以创建一个中间服务层,但我必须放弃延迟加载和更改跟踪,我真的很想保留它们。

最佳答案

首先,我要说的是,我不认为 N​​Hibernate 有责任处理安全性以及基于相同的数据编辑。我认为您试图将它放在数据访问层中会使它过于复杂。

我会在服务或 Controller 中插入一个层,从客户端(不应该是存储库本身)接收此数据请求,并根据用户权限执行数据编辑。因此,您将对数据库执行完整查询,然后根据用户权限,服务层将在通过服务连接返回该结果集之前清除结果集的字段。它不是绝对最高效的解决方案,但比将所有数据发送到客户端并让客户端软件“审查”它更安全、性能更高。数据库和服务器架构的服务层之间的以太网连接比服务层和客户端之间的互联网连接可以处理更多的带宽,并且在远程客户端应用程序中,您通常无法控制客户端对数据的处理;您可能正在与您的软件的被黑副本或类似的工作人员交谈,这不会对用户安全性产生任何影响。

如果服务和数据库之间的网络带宽非常重要,或者如果大量信息受到限制,Linq2NH 应该足够智能,让您使用选择列表指定查询结果中应该或不应该包含的内容:

if(!user.CanSeeRestrictedFields)
var results = from p as Repository.AsQueryable<Person>()
//rest of Linq statement
select new Person {
Name = p.Name,
Age = p.Age
};
else
var results = from p as Repository.AsQueryable<Person>()
//rest of Linq statement
select new Person {
Name = p.Name,
Age = p.Age,
SocialSecurityNumber = p.SocialSecurityNumber,
MothersMaidenName = p.MothersMaidenName
};

我不知道 Linq2NH 是否足够聪明,可以将条件运算符解析为 SQL;我对此表示怀疑,但在偶然的情况下,您可以根据用户是否有权查看 SSN 和 MMN 字段在初始化程序中指定条件运算符,从而允许您组合这两个查询。

关于c# - 保护/省略 NHibernate 中域实体的选定属性(子类、投影、?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3661073/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com