起名Lind.DDD.Manager里菜单权限的安插性

转自:http://blog.csdn.net/leonwei/article/details/8880012

回去目录

多谢大家关切转发本文请注脚:http://blog.csdn.net/leonwei/article/details/8880012

对于三个后台管理种类来说,你的权杖设计与克拉玛依是至关心器重要,当你为二个权力分配1些菜谱后,当以此权力的用户并未有菜单权限时,这么些菜单的U奥迪Q5L是无法被用户访问的,而在前边的计划中,未有设想到那点,所以此次Lind.DDD.Manager的升级中,需求把这块完善一下,将会在二月的Lind.DDD中贡献给大家,敬请期待!

 

思路

用户访问

==>

mvc根据url找到controller/action

==>

看清那些U奥迪Q⑤L是不是为库中定义的U哈弗L(排除非平常U福睿斯L,PartialView产生的UQashqaiL)

==>

看清用户是不是有其1U奥迪Q叁L的权限

==>

例行访问

正文将用作笔者《从零开端做OpenCL开发》连串小说的首先篇。

层关系图

起名 1

 

实现

动用了MVC环境下的AOP方法阻碍技术,它至关心重视要透过过滤器(AuthorizeAttribute)来实现对action的掣肘,然后注入本人的代码,那也是MVC几大过滤器带给我们的大悲大喜!

AuthorizeAttribute
为我们提供了八个用户授权的过滤器,当用户访问Action从前,它将被实施

   // 摘要:
    //     表示一个特性,该特性用于限制调用方对操作方法的访问。
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
    public class AuthorizeAttribute : FilterAttribute, IAuthorizationFilter
    {
        // 摘要:
        //     初始化 System.Web.Mvc.AuthorizeAttribute 类的新实例。
        public AuthorizeAttribute();

        // 摘要:
        //     获取或设置用户角色。
        //
        // 返回结果:
        //     用户角色。
        public string Roles { get; set; }
        //
        // 摘要:
        //     获取此特性的唯一标识符。
        //
        // 返回结果:
        //     此特性的唯一标识符。
        public override object TypeId { get; }
        //
        // 摘要:
        //     获取或设置授权用户。
        //
        // 返回结果:
        //     授权用户。
        public string Users { get; set; }

        // 摘要:
        //     重写时,提供一个入口点用于进行自定义授权检查。
        //
        // 参数:
        //   httpContext:
        //     HTTP 上下文,它封装有关单个 HTTP 请求的所有 HTTP 特定的信息。
        //
        // 返回结果:
        //     如果用户已经过授权,则为 true;否则为 false。
        //
        // 异常:
        //   System.ArgumentNullException:
        //     httpContext 参数为 null。
        protected virtual bool AuthorizeCore(HttpContextBase httpContext);
        //
        // 摘要:
        //     处理未能授权的 HTTP 请求。
        //
        // 参数:
        //   filterContext:
        //     封装有关使用 System.Web.Mvc.AuthorizeAttribute 的信息。filterContext 对象包括控制器、HTTP 上下文、请求上下文、操作结果和路由数据。
        protected virtual void HandleUnauthorizedRequest(AuthorizationContext filterContext);
        //
        // 摘要:
        //     在过程请求授权时调用。
        //
        // 参数:
        //   filterContext:
        //     筛选器上下文,它封装有关使用 System.Web.Mvc.AuthorizeAttribute 的信息。
        //
        // 异常:
        //   System.ArgumentNullException:
        //     filterContext 参数为 null。
        public virtual void OnAuthorization(AuthorizationContext filterContext);
        //
        // 摘要:
        //     在缓存模块请求授权时调用。
        //
        // 参数:
        //   httpContext:
        //     HTTP 上下文,它封装有关单个 HTTP 请求的所有 HTTP 特定的信息。
        //
        // 返回结果:
        //     对验证状态的引用。
        //
        // 异常:
        //   System.ArgumentNullException:
        //     httpContext 参数为 null。
        protected virtual HttpValidationStatus OnCacheAuthorization(HttpContextBase httpContext);
    }

对此我们的菜谱权限过滤器,供给持续它,大家起名称叫ManagerUrlAttribute,上面是四叔设计的代码,大家能够看成参考

    /// <summary>
    /// 后台URL菜单的权限
    /// 需要考虑到PartialView的问题
    /// </summary>
    public class ManagerUrlAttribute : AuthorizeAttribute
    {
        /// <summary>
        /// 验证失败后所指向的控制器和action
        /// 可以在使用特性时为它进行赋值
        /// </summary>
        public ManagerUrlAttribute(string failControllerName = "Home", string failActionName = "Login")
        {
            _failControllerName = failControllerName;
            _failActionName = failActionName;
        }
        /// <summary>
        /// 出错时要跳转的控制器
        /// </summary>
        string _failControllerName;
        /// <summary>
        /// 出错时要跳转的action
        /// </summary>
        string _failActionName;
        /// <summary>
        /// 菜单仓储
        /// </summary>
        static IExtensionRepository<WebManageMenus> menuRepository = new ManagerEfRepository<WebManageMenus>(new ManagerContext());
        /// <summary>
        /// 所有已经定义的菜单项
        /// </summary>
        static List<WebManageMenus> allMenuList = menuRepository.GetModel().ToList();

        public override void OnAuthorization(AuthorizationContext filterContext)
        {

            var menuIdArr = Array.ConvertAll<string, int>(CurrentUser.ExtInfo.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries), i => int.Parse(i));
            var menuUrlArr = allMenuList.Where(i => menuIdArr.Contains(i.Id)).Select(i => i.LinkUrl).ToList();
            var controllerName = filterContext.RouteData.Values["controller"].ToString();
            var actionName = filterContext.RouteData.Values["action"].ToString();
            var isValid = allMenuList.FirstOrDefault(i => i.LinkUrl == "/" + controllerName + "/" + actionName) != null;//是否为有效的URL,过滤分布视图

            //当前为正常页面,不是分布视图
            if (isValid)
            {
                //没有当前URL的权限,跳到登陆页
                if (!menuUrlArr.Contains("/" + controllerName + "/" + actionName))
                {
                    filterContext.Result = new RedirectToRouteResult("Default", new RouteValueDictionary { 
                              { "Action",_failActionName },
                              { "Controller", _failControllerName} });
                }
            }
        }

    }

本代码消除了遍布视图在过滤器中的狼狈,将遍布视图发生的action进行过滤,大家先将持有定义的菜单ULANDL取出来,然后用户访问时,先判断当前UOdysseyL是或不是为早已定义的URubiconL,如若是,再进行权力的比较.

 回去目录

一 异构计算、GPGPU与OpenCL

  OpenCL是日前3个通用的由众多商厦和团队联合发起的多CPU\GPU\别的芯片
异构总括(heterogeneous)的正经,它是跨平台的。意在丰裕利用GPU强大的并行计算能力以及与CPU的协同工作,更便捷的运用硬件高效的完结周边的(特别是并行度高的)总结。在过去使用GPU对图像渲染举行加快的技术十二分干练,可是大家驾驭GPU的芯片结构擅长大规模的并行总结(PC级的GPU可能就是CPU的上万倍),CPU则擅长逻辑控制,因而不只局限与图像渲染,人们愿意将这种计算能力扩张到更加多领域,所以那也被誉为GPGPU(即通用处总括处理的GPU)。

   
简单的讲,大家的CPU并不符合计算,它是多指令单数据流(MISD)的系列布局,特别擅长的是做逻辑控制,而数据处理中央是单流水生产线的,所以大家的代码for(i=0;…;i++)那种在CPU上要双重迭代的跑很多遍,可是你的显卡GPU则不是这么,GPU是突出的单指令多数据(SIMD)的系统布局,它不善于逻辑控制,可是真正天生的向量计算机器,对于for(i=0;…;i++)那样的代码有时只必要跑1回,所以图形世界中那么多的顶峰、片段才能便捷的相互在显卡中渲染处理

起名 2

 

GPU的结晶管能够到几10亿个,而CPU平时唯有多少个亿,

起名 3

如上海体育场合是NVidia Femi十0的组织,它富有大量的并行计算单元。

由此人们就想什么将越多的测算代码搬到GPU上,让她不知做rendering,而CPU只担负逻辑控制,那种叁个CPU(控制单元)+多少个GPU(有时可能再加多少个CPU)(计算单元)的架构正是所谓的异构编制程序(heterogeneous),在那其间的GPU正是GPGPU。异构编制程序的前景和功能是丰富振奋人心的,在诸多天地,尤其是高并行度的计量中,功能进步的多少级不是数倍,而是百倍千倍。

   其实NVIDIA在很已经脱离了采纳其显卡的GPGPU计算CUDA架构,当时的影响是相当的大的,将众多乘除工作(科学总计、图像渲染、游戏)的难题提升了多少个数据级的成效,记得那时NVIDIA来南开介绍CUDA,演示了实时的ray
tracing、多量刚体的互动碰撞等例子,依旧感动了须臾间的,CUDA以往好像早就前进到了5.0,而且是NVDIA主力推的通用总计架构,可是CUDA最大的受制便是它不得不使用N家自个儿的显卡,对于广泛的A卡用户鞭长莫及。OpenCL则在之后出现,它由一点都不小主流芯片商、操作系统、软件开发者、学术部门、中间件提供者等营业所协助举行倡议,它最初由Apple建议发起标准,随后Khronos
Group成立工作组,协调那些集团壹起维护那套通用的计量语言。Khronos
Group听起来相比较熟习吧,图像绘制领域有名的软硬件接口API规范盛名的OpenGL也是以此公司珍视的,其实他们还维护了广大多媒体领域的正儿捌经,恐怕也是近似于Open***起名的(所以刚听到OpenCL的时候就在想它与OpenGl有吗关系),OpenCl未有一个特定的SDK,Khronos
Group只是点名专业(你能够通晓为她们定义头文件),而现实的implementation则是由不一样参预公司来做,那样您会意识NVDIA将OpenCL做了完毕后即成到它的CUDA
SDK中,而英特尔则将其落到实处后放在所谓是英特尔 应用软件 (Accelerated Paral
Processing)SDK中,而英特尔也做了落到实处,所以近年来的主流CPU和GPU都协理OpenCL架构,就算区别商家做了差异的SDK,可是他们都依据同样的OpenCL规范,也正是说原则上一旦您用规范OpenCl头中定义的那个接口的话,使用NVIDIA的SDK编的次第能够跑在A家的显卡上的。但是分裂的SDK会有指向他们芯片的一定扩充,那点类似于标砖OpenGL库和GL库扩大的涉及。

 
OpenGL的面世使得英特尔在GPGPU领域终于迎头赶上的NVIDIA,然而NVIDIA虽为OpenCL的壹员,不过他们就好像越来越器重本人的独门武器CUDA,所以N家对OpenCL达成的扩大也要比英特尔少,AMD由于同时做CPU和GPU,还有他们的APU,如同对OpenCL更饱满一些。

 

二.有关在GPU上写代码的这么些事儿

 
OpenCL也是通过在GPU上写代码来加速,只但是他把CPU、GPU、别的什么芯片给统一封装了起来,越来越高了一层,对开发者也更融洽。谈起此处骤然很想赘述一些在GPU上写代码的那些历史。。

 
其实最初叶显卡是不设有的,最早的图形处理是放在CPU上,后来察觉能够再主板上放3个独门的芯片来加快图形绘制,这时还叫图像处理单元,直到NVIDIA把那东西做强做大,并且第二给它改了个NB的名称叫,叫做GPU,也叫图像处理器,后来GPU就以比CPU高好多倍的进程增进品质。

   最先的时候GPU不能够编制程序,也叫固定管线的,正是把数据遵照确定地点的通路走完

 
 和CPU同样作为总括处理器,顺理成章就出去了可编制程序的GPU,但是那时候想在GPU上编制程序可不是简单的事,你不得不动用GPU汇编来写GPU程序,GPU汇编?听起来就是很高档的玩具,所以那时使用GPU绘制很多特殊效果的技能只控制在少数图片工程师身上,那种办法叫可编制程序管线。

   
极快那种桎桍被打破,GPU上的高等级编制程序语言诞生,在即时更先进的片段显卡上(纪念中应有是3代显卡起首吧),像C1样的高档语言能够使程序员越发简单的往GPU写代码,那个语言代表有AMD和微软联合编写的CG,微软的HLSL,openGl的GLSL等等,将来它们也一般被称之为高级着色语言(Shading
Language),那么些shader近期曾经被广泛应用于大家的各样娱乐中。

   在动用shading
language的长河中,一些科学商量人士发现众多非图形总括的题材(如数学、物理领域的并行总结)能够伪装成图形难点采取Shading
Language达成在GPU上估测计算,而那结果是在CPU上跑速度的N倍,人们又有了新的想法,想着利用GPU那种性情去消除全部大气并行总结的难点(不只图形领域),那也称为通用处理的GPU(GPGPU),很几人品尝那样做了,一段时间很多故事集在写什么怎么着利用GPU算了哪个东东。。。但是那种工作都以伪装成图形处理的款型做的,还未有1种自然的言语来让我们在GPU上做通用计算。那时又是NVIDIA带来了改革机制,0玖年前后推出的GUDA架构,能够让开发者在他们的显卡上用高档语言编写通用计算程序,如今CUDA热了4起,直到未来N卡都印着大大的CUDA
logo,然则它的局限便是硬件的限制。

 
OpenCL则突破了硬件的界线,试图在全部匡助的硬件上搭建起通用计算的一块平台,不管您是cpu依旧gpu通通同仁一视,都能展开总计,能够说OpenCL的意思在于模糊了主板上那二种关键处理器的底限,并使在GPU上跑代码变得更便于。

 

  3 OpenCL架构

  3.1 硬件层:

  上边说的都是有关通用总括以及OpenCL是怎么,上边就言简意赅的把OpenCL的架构总括一下:

  以下是OpenCL硬件层的悬空

  起名 4

 

 它是七个Host(控制处理单元,常常由二个CPU担任)和一群Computer
Device(总计处理单元,平日由局地GPU、CPU别的帮助的芯片担任),个中Compute
Device切分成很多Processing
Element(那是单身参预单数据测算的矮小单元,这一个不一样硬件完结都不雷同,如GPU只怕正是中间二个Processor,而CPU只怕是一个Core,作者猜的。。因为这一个达成对开发者是藏身的),在那之中许多个Processing
Element能够组成组为三个Computer
Unit,1个Unit内的element之间能够方便的共享memory,也唯有二个Unit内的element能够达成共同等操作。

三.贰 内部存款和储蓄器架构

起名 5

在那之中Host有协调的内部存款和储蓄器,而在compute
Device上则比较复杂,首先有个常量内存,是全部人能用的,日常也是访问最快的可是最稀有的,然后各样element有和好的memory,那是private的,贰个组内的element有他们共用的二个local
memery。仔细分析,这是3个快速优雅的内部存款和储蓄器协会措施。数据能够顺着Host-》gloabal-》local-》private的通道流动(那当中大概跨越了众七个硬件)。

叁.叁软件层面包车型客车3结合

 这么些在SDK中都有对应的数据类型

 setup相关:

  Device:对应三个硬件(标准中特地表达多core的CPU是2个全数Device)

 

 
Context:环境上下文,贰个Context包括多少个device(单个Cpu或GPU),三个Context便是那几个device的3个挂钩纽带,唯有在三个Context上的那多少个Device才能相互交换工作,你的机械上得以同时设有很多Context。你能够用三个CPu创制context,也能够用三个CPU和三个GPU制造二个。

 

Command queue:那是个给每种Device提交的吩咐连串

 

内部存款和储蓄器相关:

Buffers:那个好通晓,一块内部存款和储蓄器

Images:终究并行计算当先二分之一的使用前景在图形图像上,所以原生带有多少个连串,表示各样维度的图像。

 

gpu代码执行相关:

 Program:那是独具代码的集合,大概含有Kernel是和任何库,OpenCl是一个动态编写翻译的言语,代码编写翻译后生成1当中间文件(可实现为虚拟机代码恐怕汇编代码,看不相同完毕),在运用时连连进入程序读入处理器。

 Kernel:那是在element跑的核函数及其参数组和,借使把计算设备看做好两人还要为您做四个作业,那么Kernel便是他俩各样人做的十分事情,那几个工作各样人都以千篇一律的做,不过参数也许是见仁见智的,那正是所谓的单指令多数据体系。

 WorkI tem:那就是表示硬件上的三个Processing Element,最主旨的乘除单元。

 

协助举行相关:

伊芙nts:在如此三个分布式计算的环境中,差别单元之间的一块儿是3个大题材,event是用来1块的

 

他们的涉及如下图

起名 6

 

  
上边正是OpenCL的入门介绍,其实说实话在十年左右就跟踪过GPGPU相关的事物,那时很多连锁技术还留存于实验室,后来的CUDA出现后,也激动过,学习过阵子,可是CUDA过度依靠于特定硬件,产业应用前景并倒霉,只可以做做工程试验,你总不可能让用户装个游戏的同时,让他顺手换个高配的N卡吧。所以已经也对这几个领域不太感兴趣,近年来见到OpenCL的面世,发现只怕那个架构依然有很好的行使前景的,也是诸多厂商方今合力力推的三个东西。想想一下三个迭代一千0次的for循环贰次过,照旧很打动的1件事。

 
在游戏世界,OpenCL已经有了过多打响的实行,好像EA的F1就已经应用了OpenCL,还有1部分做海洋的lib应用OpenCL(海面水波的FFT运算在过去是不行慢的),其余还有的库干脆利用OpenCL去间接修改现有的C代码,加快for循环等,甚至还有OpenCl版本的C++
STL,叫thrust,所以作者觉着OpenCL恐怕会真正的给我们带来些什么~

 

以下是壹对关于OpenCL相比较重要的能源:

http://www.khronos.org/opencl/ 组织的主页

https://developer.nvidia.com/opencl N家的主页

http://developer.amd.com/resources/heterogeneous-computing/opencl-zone/ A家的主页

http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/ 标准的reference

http://developer.amd.com/wordpress/media/2012/10/opencl-1.2.pdf 必看最新的1.二本子标准

http://www.khronos.org/assets/uploads/developers/library/overview/opencl-overview.pdf 必看,入门的review

http://www.kimicat.com/opencl-1/opencl-jiao-xue-yi  2个教学网址

 


30

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图