2009-10-15 25 views
4

我相信這是一個比其他任何事情都更好的關於最佳實踐和設計的問題。我嘗試搜索有關此類似的查詢,但找不到任何。我實際上找到了Row Level Security with Entity Framework,但我相信這裏的背景有點不同。實現行級安全 - (SPs vs LINQ to Objects)

我會盡量先解釋一下我的情況:

我有一個使用一個共同的業務庫來訪問我的SQL通過NHibernate的2008和數據庫在.NET 3.5網頁。所有代碼都是C#,使用NHibernate 2.1。 My WebSite顯示來自業務庫的不同IList的負載,業務層通過NHibernate獲取來自SQL的所有數據。所以,因爲我可以有一個方法返回IList,返回IList,另一個IList等...... 關鍵是活動用戶只能訪問所有返回的部分內容(幾乎所有類型的結果集都必須從安全性),所以我需要在庫上實現一個「數據過濾器」,它只會將允許的數據行返回給WebSite。爲了實現這一點,我的網站上的IPrincipal被用於庫中,這樣我就可以獲取用戶的詳細信息來過濾數據,但是由於我們的安全模型非常複雜,因此將其覆蓋到我們所有的方法上會造成巨大的維護問題。 因此,爲了解決這個問題,我們創建了幾個SQL SP,它們返回當前用戶所允許的項目以及我們只需要將所請求的數據與安全數據連接起來的業務邏輯,並且我們有最終結果集發送給用戶。 現在,這個連接數據的過程是使用Linq到對象,我加入一個列表(安全)的iList,只返回允許的結果集。它可以通過GetAll()方法,ICriteria.List()或IQuery.List()或者甚至是NamedQuery.List()以及來自一個NamedQuery.List()的安全數據兩個NamedQuery.List()。我也計劃實現線程來同時允許兩個SQL調用,並且在兩個IList上執行LINQ連接之後,thread.join()。 我添加了一個示例代碼,以說明如何執行一個方法。

第二個選項,這是我們試圖擺脫的是在SQL端實現Join,讓我們所有的調用都必須來自SQL SP,它們會對安全結果進行連接,並且不允許商業代碼來獲得NHibernate功能的完整使用。

public IList<Product> GetAllByName(string FirstLetter) { 
    ICriteria GetAllCriteria = this.session.GetISession().CreateCriteria(typeof(Product)); 
    GetAllCriteria.Add(NHibernate.Criterion.Restrictions.Like("ProductName", FirstLetter)); 
    GetAllCriteria.AddOrder(NHibernate.Criterion.Order.Asc("ProductName")); 

    // Here would go the Threading for the both calls 
    IList<Guid> AllowedItems = SecurityBase.GetAllowedItemsForCurrentUser(); 
    IList<Product> AllProducts = GetAllCriteria.List<Product>(); 

    var ResultSet = from Prod in AllProducts 
        join Sec in AllowedItems on Prod.Id equals Sec 
        select Prod; 

    return ResultSet.ToList<Product>(); 
} 

現在我的問題,這是行級安全可怕的方法/實踐(請記住,我們的安全模型是非常複雜的,可定製的 - 這是業務設計),或者我們移動在正確的方向?我們可以選擇其他選擇嗎?

由於提前, 克萊頓

回答

0

作爲一個選項,你有沒有考慮一個觀點的內部的,而不是使用SQL SP返回您使用相同的邏輯允許的項目清單/加入,只查詢到的views /只提供了對視圖的許可權,而不是基礎表。

+0

嗨,謝謝你的迴應。是的,這是一個很好的選擇,但我的應用程序用戶不是數據庫用戶,所以我需要以某種方式將我的用戶ID發送到視圖,而不能使用通用的NHibernate功能。我的問題不是太多訪問數據庫,而是訪問應用程序本身。無論如何,我正在實施一個測試應用程序,看看我能否以某種方式在應用程序上放置此選項。 再次感謝。 – 2009-10-15 13:07:54

+0

歸結爲SecurityBase.GetAllowedItemsForCurrentUser如何獲取列表/它背後的邏輯是否可以輕鬆放入視圖中,而不需要聯合ID。 – Andrew 2009-10-15 13:30:12

2

我知道這是有點晚了,但你有沒有采取看看下面:

http://securedata.codeplex.com

這是一個開源項目,我是無縫地實現行級安全的首席開發人員。