NopCommerce 3. Controller 分析
1. 繼承關系,3個abstract類
System.Web.Mvc.Controller
Nop.Web.Framework.Controllers.BaseController
Nop.Admin.Controllers.BaseAdminController
2. BaseController
1. RenderPartialViewToString()
將Viewname對應的頁面加載成string
a. IViewEngine.FindPartialView() 來獲取ViewEngineReult,夠著viewcontext 實例,作為Render()的參數
b.IView.Render() 來加載到streamwriter中
c. streamwriter.Tostring()返回數據
可以擴展下壓縮html的方法
html=Regex.Replace(html,”\\n+\\s+”,string.empty);
html=Regex.Replace(html,”\\n+”,string.empty);
html=html.trim();
2. 各種發送消息的方法,主要是配合View來顯示後臺的消息
是利用ViewData,TempData來傳遞數據,然後來View中讀取循環顯示
3. AddLocales()
3. BaseAdminController
1. 無權限訪問返回錯誤的方法
a. ActionResult AccessDeniedView();
b. JsonResult AccessDeniedKendoGridJson();
4. StoreAddressAttribute
做各種判斷,如果不符合則return
只記錄Get請求的Ip地址,更新Customer表中LastIpAddress字段
5. CustomerLastActivityAttribute
記錄最後登錄的時間
更新最後活動時,1分鐘內數據不更新,防止頻繁修改,更新Customer表中LastActivityDateUtc字段
6. StoreLastVisitedPageAttribute
記錄最後查看的頁面
保存在GenericAttribute表中,需要單獨啟動是否記錄
7. ValidatePasswordAttribute
檢驗用戶是不是需要定時修改密碼,默認過期時間在setting表中的PasswordLifetime 字段中設置,默認是90天
如果未設置密碼的用戶,則下次請求時立即要求修改密碼
修改密碼就是強制調整到/CustomerChangePassword頁面中
8. NopHttpsRequirementAttribute
對get請求判斷強制跳轉ssl的地址,在setting表中ForceSslForAllPages中設置是否啟用對所有頁面強制跳轉ssl
先判斷當前請求是否是ssl,再查看當前的店是否支持ssl,如果支持的話,則跳轉到ssl地址
如果setting中未啟用該選項,則使用301跳轉到當前頁面,這不是多此一舉嗎?301 應該有玄機.
9. AdminValidateIpAddress
限制Admin後臺網頁不被其他ip訪問,保護後臺安全
在setting表中的AdminAreaAllowedIpAddresses屬性中設置允許訪問的ip地址,如果AdminAreaAllowedIpAddresses不為空,此時判斷當前request的ip地址是否在其中,不在其中則跳轉到/admin/security/accessdenied
10. AdminAuthorizeAttribute:IAuthorizationFilter
繼承自IAuthorizationFilter 接口,需要實現void OnAuthorization(AuthorizationContext filterContext);
可以在構造函數中指定bool 來跳過驗證
核心方法OnAuthorization方法中,首先在IsAdminPageRequested()方法中判斷Controller或Action上是否定義了AdminAuthorize屬性,
如果沒有權限訪問該頁面,則返回401 HandleUnauthorizedRequest
權限是定義在PermissionRecord 中,根據sysname 和roleId 來判斷權限
首先是每個customer和role有一個多對多的關聯
然後是每個role和permissionrecord有一個多對多的關聯
驗證權限就是遍歷該用戶的每一個role,然後判斷這個role對應的permissionrecord集合中是否包含當前這個頁面訪問所需要的權限
相關的表有
- Customer-客戶信息表
- CustomerRole-客戶角色表
- Customer_CustomerRole_Mapping-用戶角色表映射
- PermissionRecord-權限記錄表
- PermissionRecord_Role_Mapping-角色權限記錄關系表
11. AdminAntiForgeryAttribute:IAuthorizationFilter
是對ValidateAntiForgeryTokenAttribute屬性的封裝,但是新增了配置的功能
可以在setting表中的EnableXsrfProtectionForAdminArea中配置
這個封裝的不錯,有靈活性,還能有效利用系統原有代碼
12. AdminVendorValidation:IAuthorizationFilter
阻止非商戶角色的用戶登錄後臺
五種角色,每種角色對應不同的permissionrecord,就可以決定哪些頁面可以訪問了
- 管理員
- 論壇版主
- 註冊用戶
- 訪客
- 商戶
NopCommerce 3. Controller 分析