1. 程式人生 > >NopCommerce 3. Controller 分析

NopCommerce 3. Controller 分析

ora 網頁 tps perm password rmi 函數 活動 lifetime

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集合中是否包含當前這個頁面訪問所需要的權限


相關的表有


  1. Customer-客戶信息表
  2. CustomerRole-客戶角色表
  3. Customer_CustomerRole_Mapping-用戶角色表映射
  4. PermissionRecord-權限記錄表
  5. PermissionRecord_Role_Mapping-角色權限記錄關系表


11. AdminAntiForgeryAttribute:IAuthorizationFilter

是對ValidateAntiForgeryTokenAttribute屬性的封裝,但是新增了配置的功能


可以在setting表中的EnableXsrfProtectionForAdminArea中配置

這個封裝的不錯,有靈活性,還能有效利用系統原有代碼

12. AdminVendorValidation:IAuthorizationFilter

阻止非商戶角色的用戶登錄後臺

五種角色,每種角色對應不同的permissionrecord,就可以決定哪些頁面可以訪問了

  1. 管理員
  2. 論壇版主
  3. 註冊用戶
  4. 訪客
  5. 商戶


NopCommerce 3. Controller 分析