2010-06-17 35 views
1

我們正在開發一個時下時髦多租戶SaaS的應用程序(共享數據庫,共享模式),並有一件事我不喜歡它:不透明租戶身份與SQL Server和NHibernate的

public class Domain : BusinessObject 
{ 
    public virtual long TenantID 
    { get; set; } 

    public virtual string Name 
    { get; set; } 
} 

TenantID正在推動我的發展,因爲它幾乎無處不在,從安全的角度來看它是一個麻煩:如果惡意API用戶將TenantID更改爲其他值,會混淆。

我想要做的是在我們的域對象中完全擺脫這個TenantID,並讓NHibernate或SQL Server處理它。

從我已經在因特網和閱讀,這可以用CONTEXT_INFO做(這裏是一個NHibernatebased implementation),NHibernate filtersSQL Views並與它們的組合。

現在,我的要求如下:

  • 刪除所有提到的TenantID從域對象
  • ...但SQL服務器插入它在適當情況下(我想這與default約束實現)
  • ...顯然支持基於此條件的過濾,以便客戶永遠不會看到彼此的數據
  • 如果可能,請避免使用SQL Server視圖。
  • 有一個解決方案,它與NHibernate很好地發揮,SQL服務器MARS和SaaS的一般性質的應用程序是高併發

你對那個想法嗎?

回答

1

Jason Young在blog post中顯示了我用於具有共享數據庫和共享架構的SaaS應用程序的方法。

這與Jason Dentler的post有關,您提供的問題和映射視圖而不是表格到您的域,這是一個非常孤立的解決方案。你可以完全擺脫我非常喜歡的模型中的TenantID。

在我的應用程序中,我將它與EntityFramework結合使用,但不幸的是,EF沒有像DriverConnectionProvider這樣的好東西,這真是太遺憾了。

2

我覺得這個文件幾乎是MultiTenant的聖盃。 http://msdn.microsoft.com/en-us/library/aa479086.aspx

看看使用諸如'Shared Database Shared Schema'之類的方法之一,然後使用不同的SQL用戶連接到每個租戶。每個sql用戶都會看到一個被過濾的數據子集,並且只能夠檢索他們自己的數據,而當插入數據時,它會自動分配他們自己的tenantID。

你會發現你不需要在你的應用程序中對TenantID進行解釋,並且可以對其餘表格進行建模。