2013-04-18 41 views
0

我想實現一個安全機制來自動測試特定的插件權限和方法的安全特權,我已經有點卡住如何讓這個工作。屬性用於檢查方法權限

我寫一個自定義MEF元數據屬性,需要一個constructor屬性,如:

params PluginPermission[] permission 

這包含了所有的權限的數組,該插件是理所當然的。

的PluginPermission類的樣子:

PluginPermission.cs 

public enum PluginPermission 
{ 
    CreateUsers, 
    DeleteUsers, 
    ReadPassword, 
    WritePassword, 
    AddUsersToGroups, 
    AddGroups, 
    DeleteGroups 
} 

我也寫的是針對個人的方法和採用一個或多個PluginPermission對象告訴需要什麼樣的權限將被執行的各個方法的系統RequiredPermissionAttribute 。這些被施加到接口插件等:

ILicensingManagement.cs 

[RequiredPermission(PluginPermission.CreateUsers)] 
bool AddUser(string userName); 

顯然,如果插件不具有所需的權限爲不執行該方法的特定方法。

我堅持的是如何實際獲得RequiredPermissionAttribute類中的測試方法以在該方法執行之前運行,以及如果該方法的權限需求未被該插件滿足如何正常退出該執行。

我看着的xUnit BeforeAfterTestAttribute但執行顯得那麼具體的我stuggled拉開的源代碼,在解決辦法。

回答

0

我不能MEF具體的事情,但有一件事發表評論我要記住,自定義屬性無非是「標籤」更多,除非你的代碼中使用反射專門檢查它們,例如,他們沒有做任何事情。

的xUnit的BeforeAfterTestAttribute可能奏效,因爲xUnit的使用反射來執行的方法。當它遇到這個屬性時,它相應地改變其行爲。

屬性在.NET框架命名空間的工作,因爲無論是對他們的CLR檢查或編譯器。

我知道這並沒有真正完全回答你的問題,但它是一個有點太長投入評論。

更新:如果它是一個類,則可以使用Type來訪問屬性,如果是一個類,則可以使用MethodInfo

MethodInfo mi = /* method info */; 
Attribute[] attrs = mi.GetCustomAttributes(typeof(RequiredPermissionAttribute), false); 
RequiredPermissionAttribute req = attrs.Cast<RequiredPermissionAttribute>().FirstOrDefault(); 

if ((req != null) && (/* current user does not have the required permission */)) throw new Exception(); 

但是,這不是一個真正的安全解決方案,開發人員可以很容易地避免這些檢查。我只是簡要地看了一下,但PostSharp可能可以幫助你。

+0

事實上,我已經使用反射來檢查某些權限和wotnot,我停留在如何注入邏輯的實際執行對所需的方法權限授予類級權限的測試只是有點。 確實屬性是非常「愚蠢」,只是裝飾而已。 – Jammer

+0

不,這並不是真的要在用戶安全方面強制執行任何有關插件必需或能夠做的事情。我們的用戶安全性全部在LDAP中實現。感謝您的意見。 – Jammer