2010-02-26 60 views
2

在我的邏輯層中,我需要檢查各種操作的權限。有些行動是通用的,但有些行爲是非常專業的每個操作都有一個相應的權限層次結構,在執行操作之前進行評估。我一直在圍繞着我的建築理念,但還沒有達到一個我認爲可以擴展,簡單和優雅的穩固理念。操作,權限和體系結構

當前的代碼看起來是這樣的:

public class LogicObject 
{ 
     public void Add() 
     { 
      Check Add Permission 
      Perform 
     } 
     public void Update() 
     { 
      Check Update Permission 
      Perform 
     } 
} 

這種架構的問題在於,首先它是不是真的那麼可擴展的,第二它不允許我檢查的權限,而執行該動作。

另一個想法我是有這樣的事情:

public class AddAction : IAction 
{ 
    public bool IsPermitted; 
    public void Perform(); 
} 

public class LogicObject 
{ 
    public IAction AddAction {get { return new AddAction(); } } 
} 

我喜歡這個架構更好,但我不太設置就可以了。這似乎有點狡猾。我無法想象這種架構是獨一無二的。有什麼更好的方法來做這件事的例子?

回答

4

您擁有的另一個選擇是使用面向方面編程從您的服務外部使用組件來控制方法訪問授權。它的基本含義是您的方法將在運行時由執行授權的代碼打包。

用於實現java的示例解決方案是Spring Security,它將爲您提供多種方法來定製和定義授權方案。然後 物體看起來是這樣的:

public class logicObject { 
    @PreAuthorize("hasRole('ROLE_USER')") 
      public void update() { 
       //Perform 
      } 

    //... 
    } 

關當然,你將需要額外的代碼來定義的安全上下文,並創建與上下文logicObject類的代理,以確定您的授權本身一起。

由於您給出的代碼示例看起來像C#中的代碼,因此您可能需要查看基於角色的安全性以及[System.Security.Permissions] [2]命名空間中的所有商品。它允許您在運行時使用屬性來控制方法的訪問。您可以定義自己的自定義屬性和授權提供程序。使用它可能看起來像這樣:

public class LogicObject 
{ 
    [PrincipalPermissionAttribute(SecurityAction.Demand, Role="ROLE_USER")] 
     public void Add() 
     { 
      //Perform 
     } 

} 
0

我不認爲你的第一個例子是那麼遙遠;我將邏輯分成兩部分:將外部可見的類成員作爲外觀 - 與實際完成工作的內部(私有成員)分離。因此,外部門面工作是爲了進行函數調用,執行安全檢查並在適當的時候作出響應。這也意味着您對安全檢查的完成地點採取了一致的方法。

您可能想要考慮的另一個選擇是Microsoft企業庫,因爲它們具有涵蓋此類事物的安全塊。你可以得到一個免費的安全框架(如果你在MS營地,這個框架很有可能很適合),並且會有一些示例代碼將詳細說明你的問題。

我不確定關於擴展文檔的位置:Tom Hollanders博客可能是一個可以查看的地方,否則您可以從CodePlex獲取EntLibs。

1

它看起來像你在這裏使用C#樣式所以可能。網解決問題的方法是將屬性附加到方法的定義執行該方法所需的權限,使用例如:

public class LogicObject 
{ 
     [PrincipalPermission(Security.Demand, Role="AddItem")] 
     public void Add() 
     { 
      Perform 
     } 
     [PrincipalPermission(Security.Demand, Role="AddItem")] 
     public void Update() 
     { 
      Perform 
     } 
} 

檢查的PrincipalPermission的用戶Thread.CurrentPrincipal中,看用戶是否有權利對有問題的行動。我還構建了具有類似功能的自定義屬性,但更多地處理行級安全性而不是普通權限。

使用屬性的好處是,你可以一次編寫它和代碼應用到屬性的每一個消費者,而不是一遍一遍寫的邏輯。

+0

顯然我應該已經閱讀Amitay多博的完全發佈之前。在第一個示例中查看java代碼,並跳過其餘部分。我的錯。 – thaBadDawg 2010-03-01 04:31:44