2009-08-05 37 views
1

背景 每個項目都有一個與其關聯的帳戶。每個用戶都可以有權訪問零到多個帳戶。這又意味着每個用戶只能根據用戶的帳戶權限訪問項目的子集。對象模型授權 - OO設計問題

當用戶登錄到應用程序時,用戶對象被加載,並且在該點也加載了帳戶權限。該User對象存儲在應用程序的緩存中。項目根據需要加載。

問題 什麼是強制執行賬戶限制的最佳方式?我們希望將它從實際的表示邏輯中抽象出來,但我們認爲將授權邏輯放在Project對象內並不是一個好方法,因爲這取決於User對象。你們有什麼感想?

實施例:(aspx頁面代碼後面)

Project oProject = New Project(projectId); //Pass an Int32 here 
if (oProject.Load()) //This operation needs to check user permissions somehow 
{ /* Do stuff */ } 

回答

1

然後抽象掉用戶對象也。將用戶對象轉換爲可以使用項目中的標準接口查詢的權限集合。

+0

那麼我會將用戶對象傳遞給項目對象嗎? – 2009-08-05 15:23:28

+1

間接地,通過它的接口。在這個解決方案中,你將無法避開項目和用戶知道這個接口的事實,但是項目不需要知道它是否正在與用戶或TestHarness等進行交談。 – DanDan 2009-08-05 15:28:57

1

您可以實現一個負責驗證項目權限的類(即權限檢查邏輯是否在項目之外);例如在Java:

public interface EntitlementsManager { 
    void checkProjectPermission(String userName, int projectId) throws SecurityException; 
} 

然後在你的代碼,你只需調用在業務層傳遞結果返回給表示層之前添加到checkProjectPermission。當然,這是一種相當程序化(即非OO)的方法,但很顯然,所有基於權限的邏輯都屬於同一類。基於異常的方法也意味着代碼中的if-then語句更少。

+0

如果有多個加載項目的頁面,並且在一個頁面中用戶應該被授權加載項目,但在另一個頁面中,用戶不應該被授權加載項目? – 2009-08-05 19:55:54