我们正在开发一个时下流行的多租户 SaaS 应用程序(共享数据库、共享模式),我不喜欢它的一件事:
public class Domain : BusinessObject
{
public virtual long TenantID
{ get; set; }
public virtual string Name
{ get; set; }
}
这TenantID
让我发疯了,因为它几乎无处不在,而且从安全的角度来看这是一个麻烦:如果恶意 API 用户更改TenantID
为其他值并将混淆事情会发生什么。
我想要做的是在我们的域对象中完全摆脱它TenantID
,并让 NHibernate 或 SQL Server 处理它。
根据我已经在 Internet 上阅读的内容,这可以通过CONTEXT_INFO
(这里是基于NHibernate 的实现)、NHibernate 过滤器、SQL 视图以及它们的组合来完成。
现在,我的要求如下:
TenantID
从域对象中删除任何提及- ...但是让 SQL Server 在适当的地方插入它(我想这是通过
default
约束实现的) - ...并且显然提供基于此标准的过滤支持,以便客户永远不会看到彼此的数据
- 如果可能,请避免使用 SQL Server 视图。
- 拥有一个与 NHibernate、SQL Server 的 MARS 以及 SaaS 应用程序的一般性质高度并发的完美配合的解决方案
你对此有何看法?