本文是續上篇 使用mvchandler設計自定義系統許可權《上》
的下篇。通過本篇,我將在mvc2.0中提出乙個系統許可權的解決方案,如存在不足的地方,希望您能夠指出。謝謝!
一、回顧上篇
中的內容:
重點回顧一下上篇的3.2中的myhandler類,該類繼承mvc2.0的mvchandler類。**如下:
}貼出以上**,著重想講解的就是我們的許可權判斷應該注入在第11行,這個if語句內。將許可權注入在第11行,個人認為這個許可權是建立在mvc整個框架外的。效率應該會更高,而且隨著未來asp.net mvc版本的公升級換代。這種許可權結構在一定程度上是不受mvc框架的制約的,總比繼承authorizeattribute特性來控制許可權高明一些吧?否則那些「反reflection派」又開始出來用效率說事。
二、切入正題,將許可權功能注入系統
先看以下**:
}這裡我們還是使用.net經典的system.security.principal類庫。從httpcontext.user.identity 獲取到登入的使用者名稱符串(從name屬性獲取值)。在login這個view內儲存登入成功的使用者資訊,login view 這個登入頁面不需要對許可權進行處理,everyone 都可以開啟。後台**如下:
formsauthenticationservice auth = new formsauthenticationservice();
auth.signin("admin", false);
假設admin就是當前使用者,這裡的admin硬編碼了,應該從ui獲取。
三、具體的實現思路
在mvc2.0中如果通過action進行判斷的話,難免要考慮到area機制。因為在不同的area中,可能會出現相同的controller和action。所以在許可權判斷時還需要將area加入到邏輯中一起判斷。這樣就可以精確的控制所有的mvc的url。比如我們通過 areaname + controllername + actionname 這樣判斷就可以對系統具體的url進行唯一標識,同時也方便處理許可權了。我們將
beginprocessrequest方法重新改造如下:
}從mvc routedata 的 datatokens得到area相關資訊;values得到action與controller相關資訊,最後將獲取的值再參與具體的許可權判斷。
四、注意事項
在整個除錯的過程中,發現只有乙個地方讓我除錯了半天:
myhandler不能控制area的內部的action。後來查閱相關資料,原來是在arearegistration(mvc2.0新增area後自動生成的類)中設定問題。貼出**,供參考:
public override void registerarea(arearegistrationcontext context)
///"
, new routevaluedictionary(new )
, new routevaluedictionary(new )
, new routevaluedictionary(new )
, new helloworldhandler()));
}
新增的area結構如下:
至此,您可以在mvc2.0中加入許可權機制了。我相信通過這種方式注入自定義的許可權結構到mvc程式中,總比用httpmodule來的強一些,因為客戶端請求css/js時,不需要再過濾這類的url。**看起會更舒服點,判斷也就更簡單點。
自底向上設計
鄧輝 翻譯 長期以來,我們一直遵循這樣乙個程式設計風格方面的原則 乙個程式的功能要素不應該太大。如果程式中的某些部件的規模超出了易於理解的範圍,就會造成大量的複雜性,這些複雜性很容易隱藏錯誤,正如在乙個大城市中很容易隱藏罪惡一樣。這種程式難以理解 難以測試 難以除錯。根據這個原則,乙個大型程式必須要...
自底向上設計
鄧輝 翻譯 長期以來,我們一直遵循這樣乙個程式設計風格方面的原則 乙個程式的功能要素不應該太大。如果程式中的某些部件的規模超出了易於理解的範圍,就會造成大量的複雜性,這些複雜性很容易隱藏錯誤,正如在乙個大城市中很容易隱藏罪惡一樣。這種程式難以理解 難以測試 難以除錯。根據這個原則,乙個大型程式必須要...
LISP自底向上設計
長期以來,我們一直遵循這樣乙個程式設計風格方面的原則 乙個程式的功能要素不應該太大。如果程式中的某些部件的規模超出了易於理解的範圍,就會造成大量的複雜性,這些複雜性很容易隱藏錯誤,正如在乙個大城市中很容易隱藏罪惡一樣。這種程式難以理解 難以測試 難以除錯。根據這個原則,乙個大型程式必須要分割成一些小...