• 我记录网站综合系统 技术原理解析[10:PermissionChecker流程]


    源代码位置:\Web\Mvc\Processors:PermissionChecker.cs

    Config ->

        wojilu.Web.Mvc.CoreHandler.ProcessRequest - >

              wojilu.Web.Mvc.CoreHandler.ProcessRequest: ProcessContext.Begin ->

                   RouteProcess
                        InitContextProcess

            ActionMethodChecker

                          ForbiddenActionChecker

                          LoginActionChecker 
                          HttpMethodChecker

                          PermissionChecker

    最后一个checker的位置在生成页面之前,这个checker也是对于做成页面的Layout使用许可的预检查。

     1     public override void Process( ProcessContext context ) {
     2 
     3             MvcEventPublisher.Instance.BeginCheckPermission( context.ctx );
     4             if (context.ctx.utils.isSkipCurrentProcessor()) return;
     5 
     6             MvcContext ctx = context.ctx;
     7 
     8             IList paths = ctx.utils.getLayoutPath();
     9             for (int i = paths.Count - 1; i >= 0; i--) {
    10 
    11                 ControllerBase controller = ControllerFactory.FindSecurityController( paths[i].ToString(), ctx );
    12                 if (controller == nullcontinue;
    13 
    14                 if (ctx.controller.utils.isCheckPermission( controller.GetType() )) {
    15                     controller.CheckPermission();
    16                 }
    17 
    18                 if (ctx.utils.isEnd()) {
    19                     String msg = controller.utils.getActionResult();
    20                     context.endMsg( checkFrame( ctx, msg ) );
    21                     return;
    22                 }
    23             }
    24 
    25             context.getController().CheckPermission();
    26             if (ctx.utils.isEnd()) {
    27                 context.endMsg( checkFrame( ctx, context.getController().utils.getActionResult() ) );
    28                 return;
    29             }
    30 
    31         }

     ctx.utils.getLayoutPath:

    1         /// <summary>
    2         /// 获取所有的布局文件的路径
    3         /// </summary>
    4         /// <returns></returns>
    5         public IList getLayoutPath() {
    6             if (_layoutPath == null) _layoutPath = PathHelper.GetPathList( ctx.route.getRootNamespace(), ctx.controller.GetType().Namespace );
    7             return _layoutPath; 
    8         }

    任何一个页面可以看做小的画面元素的组合,小的画面元素可以看做更小的画面元素的组合。wojilu将这样一个个基本元素称之为Layout。页面就是一个个Layout的嵌套组合。这些Layout的访问权限就在这里检查。可能大部分说,这样的检查是多余的,但是,在日益猖獗的黑客行为上,严格的安全是第一位的。

    这篇,其实可以说的东西不多,毕竟只是一个小的Processor。

    下面来总结一下wojilu的特点

    1.所有的processor在执行前,都做了广播操作,以便系统的其他部分可以得到通知,做一些过滤。

    2.所有的Processor都可以跳过。

    3.所有的页面请求都统一放在Context容器里面。

    4.我记录的安全检查,很多是基于方法特性批注的,这个和MS的MVC有点像。

    下一篇开始讲述wojilu的页面引擎。

    我记录1.7版,在长达5个月的开发和测试后,将在6月底推出(不过,介于以前跳票的经验,可能这次还要跳票,作者是个注重品质的老实人),敬请期待。

  • 相关阅读:
    Python爬虫-- BeautifulSoup库
    Python爬虫--Requests库
    Python爬虫--Urllib库
    Python爬虫--初识爬虫
    性能测试--十个命令迅速发现性能问题
    性能测试--测试流程、APDEX、linux性能知识
    性能测试--Jmeter的Non GUI模式、集群
    Python使用Timer实现验证码功能
    Python 之Event
    Python信号量
  • 原文地址:https://www.cnblogs.com/TextEditor/p/2083938.html
Copyright © 2020-2023  润新知