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 分析的更多相关文章

  1. k8s replicaset controller分析(1)-初始化与启动分析

    replicaset controller分析 replicaset controller简介 replicaset controller是kube-controller-manager组件中众多控制 ...

  2. k8s replicaset controller分析(2)-核心处理逻辑分析

    replicaset controller分析 replicaset controller简介 replicaset controller是kube-controller-manager组件中众多控制 ...

  3. k8s replicaset controller 分析(3)-expectations 机制分析

    replicaset controller分析 replicaset controller简介 replicaset controller是kube-controller-manager组件中众多控制 ...

  4. k8s endpoints controller分析

    k8s endpoints controller分析 endpoints controller简介 endpoints controller是kube-controller-manager组件中众多控 ...

  5. kube-controller-manager源码分析-AD controller分析

    kubernetes ceph-csi分析目录导航 概述 kube-controller-manager组件中,有两个controller与存储相关,分别是PV controller与AD contr ...

  6. kube-controller-manager源码分析-PV controller分析

    kubernetes ceph-csi分析目录导航 概述 kube-controller-manager组件中,有两个controller与存储相关,分别是PV controller与AD contr ...

  7. NopCommerce源码分析ContainerBuilder builder.Update(container)

    /// <summary> /// Register dependencies /// </summary> /// <param name="config&q ...

  8. k8s deployment controller源码分析

    deployment controller简介 deployment controller是kube-controller-manager组件中众多控制器中的一个,是 deployment 资源对象的 ...

  9. k8s statefulset controller源码分析

    statefulset controller分析 statefulset简介 statefulset是Kubernetes提供的管理有状态应用的对象,而deployment用于管理无状态应用. 有状态 ...

随机推荐

  1. 【Alpha】第二次Daily Scrum Meeting

    GIT 一.今日站立式会议照片 二.会议内容 1.统计,收集整理礼物的资料与详情 2.确定网页的实现方式 三.燃尽图

  2. 【Alpha】阶段 第六次 Scrum Meeting

    每日任务 1.本次会议为第 六次 Meeting会议: 2.本次会议在上午09:35,大课间休息时间在陆大召开,召开本次会议为20分钟,讨论统一下时间安排的问题以及一些程序上的该进: 一.今日站立式会 ...

  3. 201521123003《Java程序设计》第8周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 2. 书面作业 本次作业题集集合 1.List中指定元素的删除(题目4-1) 1.1 实验总结 我们利用Sca ...

  4. 201521123121 《Java程序设计》第10周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 进程:每个进程都有独立的代码和数据空间,进程间的切换会有较大的开销,一个进程包含1--n个线程. 线程:同一 ...

  5. 201521123028 《Java程序设计》第12周学习总结

    1. 本周学习总结 流与文件 I/O流:Input/Output处理的简称,本质上就是一个数据序列.分为输入流Input Stream和输出流Output Stream. 最基本的可处理数据单位-by ...

  6. 巧用 BootStrap --- 栅格系统(布局)轻松搞定网页响应式布局!

    摘要:Bootstrap 为我们提供了一套响应式.移动设备优先的流式栅格系统,合理的使用栅格系统将会使得网站页面布局变得更加简单,在设置了媒体查询之后,响应式网站也无需再单独写了.接下来我以Boots ...

  7. [js高手之路]Node.js+jade+express+mongodb+mongoose+promise实现todolist

    promise主要是用来解决异步回调问题,其实还有好几种比promise更好的方案,后面再说,这节,我们先用promise来改造下,我以前写的一篇文章[js高手之路]javascript腾讯面试题学习 ...

  8. angular学习笔记04 理论加实践

    scope: 布尔型或对象(默认为false) ,为true时继承父作用域并创建一个新的作用域隔离作用域具有隔离作用域的指令最主要的使用场景是创建可复用的组件, 组件可以在未知上下文中使用,并且可以避 ...

  9. 初识Hibernate之环境搭建

         相信所有做后端的程序员同行们,没有不知道Hibernate大名的.这是一个经典的轻量级Java EE持久层的解决方案,它使得我们程序员能以面向对象的思维操作传统的关系型数据库,这也是其存在的 ...

  10. 线段树初步__ZERO__.

    线段树,顾名思义,就是指一个个线段组成的树. 线段树的定义就是: 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点.使用线段树可以快速的查找某 ...