仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 602|回复: 8
打印 上一主题 下一主题

[学习教程] ASP.NET教程之Asp.net Mvc4 基于Authorize完成的模块...

[复制链接]
透明 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:17:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
我认为,可以通过更加简单的首次编译,而增加第二次编译的负担,来提高java的运行效率。只是将java源代码进行简单的等价转换,而不假设编译成某种虚拟机器的目标格式,而由本地编译器针对性的二次编译。在MVC中,我们能够经由过程在action大概controller上设置Authorize[Role="xxx"]的体例来设置用户对action的会见权限。明显,如许其实不能满意我们的需求,

关于一样平常的MVC体系来讲,假如我们界说一个controller来处置一个模块的话,我们大抵有以下需求:

一,单个action的会见权限。假如删除,列表action

二,一个action两种权限,如edit(int?id)假如id为null则增加,大概修正

三,在此cotroller考证别的模块权限,好比,我们要在旧事模块猎取旧事列表

四,关于某些经由过程模块,如分类,我们但愿经由过程传进分歧的参数能够考证分歧模块的权限

关于四种情形,我幻想的设法是:

关于第一种,间接制订controller的moduleid和action的权限

[Module(ModuleId=6)]
publicclassController:Controller{
[SysAuthorize(Permission.List)]//设置action要考证的权限
publicActionResultList()
}



关于第二种情形,我们但愿经由过程参数来到达考证谁人权限的目标:

[Module(ModuleId=6)]
publicclassController:Controller{
//假如参数为null是将考证增加权限不然考证修正权限
[SysAuthorize(Permission.Add,Permission.Edit,"id",null)]
publicActionResultEdit(int?id)
}



关于第三种情形,我们能够为action考证指订单独的模块id

[Module(ModuleId=6)]
publicclassController:Controller{
[SysAuthorize(9,Permission.List)]//此方面考证模块9的列表权限
publicActionResultList(intCType)
}



关于第四种情形,我们能够为模块增加分歧的参数module对应干系
  1. [Module(ModuleId=5,"CType",1)][Module(ModuleId=6,"CType",2)]publicclassController:Controller{假如以后传进CType为1则考证ModuleId=5,即是2是考证ModuleId=6[SysAuthorize(Permission.List)]publicActionResultList(intCType)}
复制代码
设法定好今后,我们就能够往完成了。
起首,我们界说一个module的特征:
  1. ///<summary>///模块信息特征///</summary>[AttributeUsage(AttributeTargets.Class,Inherited=true,AllowMultiple=true)]publicclassModuleAttribute:Attribute{publicModuleAttribute(){}publicModuleAttribute(intmoduleId){this.ModuleId=moduleId;}publicModuleAttribute(intmoduleId,stringparName,objectvalue):this(moduleId){this.ParameterName=parName;this.ParameterValue=value;}///<summary>///模块Id///</summary>publicintModuleId{get;set;}///<summary>///以后模块对应参数名///</summary>publicstringParameterName{get;set;}///<summary>///以后模块参数值///</summary>publicobjectParameterValue{get;set;}///<summary>///考证参数值是不是有准确///</summary>publicboolCheckParameter(HttpRequestBaserequest){varval=request[ParameterName];boolb=false;if(val==null&&ParameterValue==null)b=true;elseif(val!=null&&ParameterValue!=null&&val==ParameterValue.ToString())b=true;returnb;}}
复制代码
完成了模块特征今后,就是对照主要的考证特征了:
  1. ///<summary>///体系权限考证///<remarks>///0,只考证上岸:无参数时,只考证上岸///1,单一:只一指定权限代码时考证以后模块的指定权限///2,二选一:指定两种权限代码时,依据参数考证,假如参数即是指定参数,则考证前者,不然考证后者///</remarks>///</summary>[AttributeUsage(AttributeTargets.ClassAttributeTargets.Method,Inherited=true,AllowMultiple=false)]publicclassSysAuthorizeAttribute:AuthorizeAttribute{///<summary>///考证是不是上岸///</summary>publicSysAuthorizeAttribute(){}///<summary>///考证基础权限///</summary>publicSysAuthorizeAttribute(Permissionpermission){this.PermissionFlag=permission;}///<summary>///考证基础权限///</summary>publicSysAuthorizeAttribute(intmoduleId,Permissionpermission):this(permission){this.ModuleId=moduleId;this.IsSetModuleId=true;}///<summary>///带参数的考证///</summary>publicSysAuthorizeAttribute(Permissionpermission,stringparName,objectvalue=null){this.PermissionFlag=permission;this.ParameterName=parName;this.ParameterValue=value;}///<summary>///带参数的考证///</summary>publicSysAuthorizeAttribute(intmoduleId,Permissionpermission,stringparName,objectvalue=null):this(permission,parName,value){this.ModuleId=moduleId;this.IsSetModuleId=true;}///<summary>///带参数的考证二选一///</summary>publicSysAuthorizeAttribute(Permissionbefore,Permissionafter,stringparName,objectvalue=null){this.PermissionFlag=before;this.PermissionFlag1=after;this.ParameterName=parName;this.ParameterValue=value;}///<summary>///带参数的考证二选一///</summary>publicSysAuthorizeAttribute(intmoduleId,Permissionbefore,Permissionafter,stringparName,objectvalue=null):this(before,after,parName,value){this.ModuleId=moduleId;this.IsSetModuleId=true;}///<summary>///以后要考证的权限代码///</summary>privatePermission?PermissionFlag{get;set;}///<summary>///以后要考证的另外一个权限代码(当二选一考证考证体例时无效)///</summary>privatePermission?PermissionFlag1{get;set;}///<summary>///是不是自界说设置了moduleId///</summary>privateboolIsSetModuleId{get;set;}///<summary>///猎取或设置以后模块Id///</summary>publicint?ModuleId{get;set;}///<summary>///权限考证参数名///</summary>publicstringParameterName{get;set;}///<summary>///权限考证参数值///</summary>publicobjectParameterValue{get;set;}///<summary>///考证了局///</summary>publicboolAuthorizeResult{get;privateset;}///<summary>///考证前猎取moduleId///</summary>publicoverridevoidOnAuthorization(AuthorizationContextfilterContext){if(!IsSetModuleId){varmodules=filterContext.Controller.GetModules();//一个模块的的时分,只第一次进进时猎取他的模块id,缓存今后不作处置if(modules.Count==1&&ModuleId==null){if(!string.IsNullOrWhiteSpace(modules[0].ParameterName)){if(modules[0].CheckParameter(filterContext.HttpContext.Request))ModuleId=modules[0].ModuleId;}elseModuleId=modules[0].ModuleId;}//多个模块的时分,每次考证强迫更新及moduleidelseif(modules.Count>1){foreach(varminmodules){if(m.CheckParameter(filterContext.HttpContext.Request)){ModuleId=m.ModuleId;break;}}}}base.OnAuthorization(filterContext);}///<summary>///中心考证///</summary>protectedoverrideboolAuthorizeCore(HttpContextBasehttpContext){//假如未上岸,则跳转到上岸页if(!httpContext.User.Identity.IsAuthenticated)httpContext.Response.Redirect(FormsAuthentication.LoginUrl);AuthorizeResult=true;if(PermissionFlag!=null){if(PermissionFlag.Value==Permission.Administrator)returnAdminSiteService.CheckAdministrator();//未设置模块id,则抛出非常if(ModuleId==null)thrownewException(string.Format("未设置模块id的Control不克不及举行权限考证!"));//处置二选一if(PermissionFlag1!=null){if(string.IsNullOrWhiteSpace(ParameterName))thrownewException(string.Format("请为二选一考证指定响应的参数名!"));//假如参数值即是给定值,则考证前者,不然考证后者if(CheckParameter(httpContext.Request))AuthorizeResult=AdminSiteService.CheckPermission(ModuleId.Value,(int)PermissionFlag.Value);elseAuthorizeResult=AdminSiteService.CheckPermission(ModuleId.Value,(int)PermissionFlag1.Value);}else//一样平常考证处置{//假如参数名不为空,则先考证参数值是不是婚配if(!string.IsNullOrWhiteSpace(ParameterName))AuthorizeResult=CheckParameter(httpContext.Request);if(AuthorizeResult)AuthorizeResult=AdminSiteService.CheckPermission(ModuleId.Value,(int)PermissionFlag.Value);}}returnAuthorizeResult;}///<summary>///毛病处置///</summary>protectedoverridevoidHandleUnauthorizedRequest(AuthorizationContextfilterContext){filterContext.Result=newRedirectResult("~/Main/Error?code=100");}///<summary>///考证参数值是不是有准确///</summary>privateboolCheckParameter(HttpRequestBaserequest){varval=request[ParameterName];boolb=false;if(val==null&&ParameterValue==null)b=true;elseif(val!=null&&ParameterValue!=null&&val==ParameterValue.ToString())b=true;returnb;}}
复制代码
注重AuthorizeAttribute缓存成绩。第一会见时会缓存该Action的身份认证类,以是多模块考证时必要从头猎取moduleId

假如以后AuthorizeAttribute没有指定moduleid,则每次会见强迫更新其moduleId

增补一下猎取把持器模块的扩大办法:
  1. ///<summary>///猎取把持器相干模块///</summary>publicstaticList<ModuleAttribute>GetModules(thisControllerBasecontroller,booluseCache=true){if(controller==null)returnnull;stringcacheKey=string.Format("{0}_Modules",controller.GetType().Name);if(useCache){if(CacheProvider.Cache.Contains<List<ModuleAttribute>>(cacheKey))returnCacheProvider.Cache.Get<List<ModuleAttribute>>(cacheKey);}varmoduleInfos=controller.GetType().GetCustomAttributes(typeof(ModuleAttribute),false);List<ModuleAttribute>modules=newList<ModuleAttribute>();if(moduleInfos.Length<=0)returnmodules;foreach(varminmoduleInfos){modules.Add((ModuleAttribute)m);}if(useCache)//缓存把持器模块信息CacheProvider.Cache.Add<List<ModuleAttribute>>(cacheKey,modules,20);returnmodules;}
复制代码
考证办法次要是帮我们辨别出是考证哪个模块的哪个权限,最初把模块id和权限标识传进我们的逻辑层举行考证,我们能够在上岸的时分缓存用户的模块权限。
考证大抵代码:
  1. ///<summary>///判别以后上岸用户对操纵是不是有权限///</summary>publicstaticboolCheckPermission(intModuleId,intpermissionFlag){//FormsAuthentication.GetAuthCookie()varuser=HttpContext.Current.User;//未上岸的用户if(!user.Identity.IsAuthenticated)returnfalse;AdminInfoinfo=GetLoginAdminInfo();//超等办理员有一切权限if(info.RoleId==Constant.AdministratorRoleId)returntrue;if(!info.ModulePermissions.Exists(t=>t.AdminId==info.AdminId&&t.ModuleId==ModuleId&&t.PermissionFlag==permissionFlag))returnfalse;returntrue;}
复制代码
最初,我们就能够在我们的体系中利用了:
  1. usingFL.Entitys;usingFL.Site.Service;usingFL.Site.SysManager.Common;usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Web;usingSystem.Web.Mvc;usingFL.Site.ViewModel;usingFL.Site.SysManager.JUI;namespaceFL.Site.SysManager.Controllers{[Module(ModuleId=7)]publicclassAdminController:BaseController<AdminSiteService>{///<summary>///分页列表///</summary>[SysAuthorize(Permission.List)]publicActionResultList(PagerPostItempostPager){varpager=newPagerItem(postPager,TargetType.NavTab);intrecordCount;varlist=Service.GetPageList(pager.currentPage,pager.numPerPage,outrecordCount);pager.totalCount=recordCount;varroles=newRoleSiteService().GetRoles();ViewBag.Roles=roles;returnView(list,pager);}///<summary>///编纂输出///</summary>[SysAuthorize(Permission.Add,Permission.Update,"id")]publicActionResultEdit(int?id){varentity=newAdminSaveModel();if(id!=null)entity=Service.GetById(id.Value);varroles=newRoleSiteService().GetRoles();ViewBag.Roles=newSelectList(roles,"RoleId","RoleName",entity.RoleId);returnView(entity);}///<summary>///保留数据///</summary>[HttpPost][SysAuthorize(Permission.Add,Permission.Update,"AdminId",0)]publicActionResultEdit(AdminSaveModelentity){entity.LastUpdateTime=DateTime.Now;entity.LastUpdateAdmin=UserInfo.LoginName;if(ModelState.IsValid)returnJson(Service.Save(entity));elsereturnJson(AjaxResult.NewModelCheckErrorResult(ModelState));}///<summary>///删除指定id的数据///</summary>[SysAuthorize(Permission.Delete)]publicActionResultDelete(intid,introleId){returnJson(Service.Delete(id,roleId),false);}///<summary>///修正暗码///</summary>[SysAuthorize(Permission.Update)]publicActionResultEditPwd(intid){ViewBag.Id=id;returnView();}[HttpPost][SysAuthorize(Permission.Update)]publicActionResultEditPwd(stringPwd,stringConfirmPwd,intid){returnJson(Service.UpdatePassword(Pwd,ConfirmPwd,id));}///<summary>///猎取用户上岸日记///</summary>[SysAuthorize(22,Permission.List)]publicActionResultLoginLog(PagerPostItempostPager){varpager=newPagerItem(postPager,TargetType.NavTab);intrecordCount;varlist=Service.GetLoginLogPageList(pager.currentPage,pager.numPerPage,outrecordCount);pager.totalCount=recordCount;returnView(list,pager);}}}
复制代码
好久没写文章,有点小乱,也没供应代码及数据库相干的器材,也算是分享一种相法吧。程序一团体写久了很孤单
数据库大抵布局:模块表,脚色表,用户表,模块权限表,脚色模块权限表,用户脚色表,别的写一个视图猎取用户的模块权限,在上岸的时分缓存,就能够利用下面的体例考证了。
总结:在基于模块的权限考证体系中,只必要为程序供应模块,上岸用户及要考证的权限,就能够十分便利的考证用户权限。下面的一系列代码都是为了获得我们想要的模块id和权限
弱点:模块id和权限代码不克不及任意变动,固然,能够用一个常量类来保留我们的模块和权限,可是总的下去说,还能够迁就利用的。
有时也搞不懂应该学那种;主要看你以后去的那个公司是使用哪种了。就像王千祥的课上说的:企业应用现在主要就三层(其实也差不多就是MVC):表示层(主要使用html写的,很简单)、业务逻辑层(主要就是应用服务器的)。最后就是数据层(其实就是学习数据库)
柔情似水 该用户已被删除
沙发
发表于 2015-1-19 06:48:49 | 只看该作者
弱类型造成潜在的出错可能:尽管弱数据类型的编程语言使用起来回方便一些,但相对于它所造成的出错几率是远远得不偿失的。
简单生活 该用户已被删除
板凳
发表于 2015-1-26 16:35:30 | 只看该作者
主流网站开发语言之CGI:CGI就是公共网关接口(CommonGatewayInterface)的缩写。它是最早被用来建立动态网站的后台技术。这种技术可以使用各种语言来编写后台程序,例如C,C++,Java,Pascal等。
分手快乐 该用户已被删除
地板
发表于 2015-2-4 20:32:01 | 只看该作者
我的意思是.net好用,从功能上来说比JAVA强还是很明显的。
蒙在股里 该用户已被删除
5#
发表于 2015-2-10 07:55:27 | 只看该作者
主流网站开发语言之ASP:ASP是微软(Microsoft)所开发的一种后台脚本语言,它的语法和VisualBASIC类似,可以像SSI(ServerSideInclude)那样把后台脚本代码内嵌到HTML页面中。虽然ASP简单易用,但是它自身存在着许多缺陷,最重要的就是安全性问题。
爱飞 该用户已被删除
6#
发表于 2015-3-1 04:10:35 | 只看该作者
可以通过在现有ASP应用程序中逐渐添加ASP.NET功能,随时增强ASP应用程序的功能。ASP.NET是一个已编译的、基于.NET的环境,可以用任何与.NET兼容的语言(包括VisualBasic.NET、C#和JScript.NET.)创作应用程序。另外,任何ASP.NET应用程序都可以使用整个.NETFramework。开发人员可以方便地获得这些技术的优点,其中包括托管的公共语言运行库环境、类型安全、继承等等。
小妖女 该用户已被删除
7#
发表于 2015-3-10 12:48:04 | 只看该作者
ASP.net1.1和2.0在程序上的语法也有很大不同,现在2.0属于新出来的,不知道半年后会不会有3.0(说笑一下)。Windows2003系统自动支持ASP和ASP.net环境,不用安装任何程序。Asp.net属于编译语言。ASP的最大不同(ASP属于解释语言)。
第二个灵魂 该用户已被删除
8#
发表于 2015-3-17 07:36:42 | 只看该作者
由于JSP/Servlet都是基于Java的,所以它们也有Java语言的最大优点——平台无关性,也就是所谓的“一次编写,随处运行(WORA–WriteOnce,RunAnywhere)”。除了这个优点,JSP/Servlet的效率以及安全性也是相当惊人的。
9#
发表于 2015-3-24 02:27:37 | 只看该作者
市场决定一切,我个人从经历上觉得两者至少在很长时间内还是要共存下去,包括C和C++,至少从找工作就看得出来,总不可能大家都像所谓的时尚一样,追捧一门语言并应用它。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-18 06:23

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表