2010-12-09 96 views
1

比方說,我有一個ASP.NET MVC Web應用程序調用的存儲庫層,它是建立在NHibernate的頂部。控制器通過資源庫的ISecurityToken一個封裝當前用戶的身份和權限,查詢只返回行的用戶應該能夠看到當倉庫使用它。我的安全邏輯應該放在哪裏?

我想要一個實體(機票)僅由特定的用戶組,以及票被分配給該用戶是可關閉的。換句話說,假設CanCloseTicket()方法需要兩個輸入:

  1. 票本身(或其當前所有者ID)
  2. 當前用戶的ISecurityToken

應該在哪裏這個假設的方法活?我可以看到幾種可能性,但每種都有其缺點。

  • 在控制器中:控制器可以訪問所有必需的東西,但是這樣可以讓安全被繞過。 (「哎呀,我忘了在此操作中調用CanCloseTicket(),然後將ticket.IsOpen設置爲false!」這味道不好。
  • 在存儲庫中:存儲庫也可以訪問這兩個作品,但我也必須製作Ticket.IsClosed的設定裝置專用於阻止發生上述同樣的事情。這個倉庫生活在一個完全不同的裝配比這樣使用內部制定者將無法正常工作模式,我可以代替離開的setter公衆和屬性的當前值比較其原一個,如果一個非特權用戶關閉它會返回一個錯誤,但是這對我來說也有點味道(「哎呀,我忘了檢查這個動作方法中的返回值repo.CloseTicket()!」)
  • 在票證中:添加Ticket.Close(ISecurityToken token),並讓實體負責自己的安全邏輯感覺li違反SRP

我認爲知識庫是這裏最好的選擇,但它感覺更像是最差的選項。還有別的事嗎?

+0

請問`Ticket`類有哪些職責? – 2010-12-10 14:05:10

回答

1

您的最終選擇聽起來恰到好處:當有人想要關閉一張票時,他們必須以安全令牌的形式提供證據。 (話雖如此,這已經夠難判斷SRP的侵犯,當你訪問一個類的源代碼,我不能說我完全有信心。)

相關問題