网站建设情况登记表,做诚信通网站,百度搜索引擎的网址是,拓者吧室内设计网站转自#xff1a;http://www.cnblogs.com/tsoukw/archive/2010/09/27/1836485.html喜欢金庸的武侠#xff0c;对他那几部小说也是乐此不疲拿独孤求败来说#xff0c;他的剑#xff0c;从无名利剑#xff0c;玄铁重剑#xff0c;到木剑乃至最后的无剑#xff0c;不知道破世… 转自http://www.cnblogs.com/tsoukw/archive/2010/09/27/1836485.html 喜欢金庸的武侠对他那几部小说也是乐此不疲拿独孤求败来说他的剑从无名利剑玄铁重剑到木剑乃至最后的无剑不知道破世间多少玄机软件设计与用剑也颇有几分相似之处 下面就拿大家耳熟能详的权限设计为例聊聊我对权限设计理解的三个层次吧 第一层手中有剑心中无剑年少时凭着手上的这把无名利剑锋芒毕露以为只要有这件利器在手这天下便唯我独尊。 XX你那个薪资查询系统怎么谁都可以进去查啊?啊?...只有总经理和他的助理可以查!哦... if(Session[UserID]null) throw new PermissionException(必须登录);string userID Session[UserID].ToString();if(!(userID88.00 || userID888.00)) //总经理的用户ID 88,总经理的助理用户ID:888 throw new PermissionException(您没有访问此页的权限); 权限这玩意刚开始其实非常简单谁又能不会? 然后听说大部分页面都要管控很快:public class PermissionHelper{ public static bool CheckPermission(string pageID);}用一个方法统一封装那部分代码。再建一个table记入哪些页面可以给哪些user访问pageID userID------- --------薪资查询 88.00薪资查询 888.00薪资输入 99.00 --人事主管----------------------------------这样只要在PageLoad中CheckPermission一下就行 接着又可以由要进行权限管控的页面统一继承一个类然后只在这基类中call一次CheckPermission就行public class PermissionPage:System.Web.UI.Page{ override PageLoad(){ PermissionHelper.CheckPermission(pageID); } protected abstract string pageID{get;}}权限页面继承此类override pageID就能完成当前页的权限管控 当然在asp.net中还有其它的一些方法如利用asp.net的HttpModule可以在访问页面之前就完成权限管控这种方法耦合性更低灵活性更高不过可能就要多费一些功夫记录一下Request的Url和PageID对应才可url pageID------------------SalaryQuery.aspx 薪资查询SalaryEdit.aspx 薪资输入------------------------------------ 昨夜西风凋碧树。独上高楼望尽天涯路执着加上勤奋终于利剑出鞘手到擒来 当然世间万物各有不同 有通过控制WebForm的各种控件的状态如Button的Enable,Visible来控制权限的也有在MVC中通过在Controller中设定Attribute完成还有控制菜单控制数据库中table的栏位以及增/删/改/查的 可谓八仙过海各显神通最终都在自己的势力范围下建功立业 剑是好剑也能杀人不过却不明白这把剑好在哪于是就今天用的还是青龙剑明天却又发现了偃月刀也很犀利可能也就转成刀客了停留在此种境界即是心中无剑最终也不过是个剑客罢了 要做剑圣还必须真正地研究各种不同的剑领悟剑的本质锻造出适合自己风格的绝世好剑--玄铁重剑这也是第二层境界手中有剑心中也有剑 心中有剑后手中的剑才能直指目标更犀利更直接杀人于无形真正雄霸天下。 要到这一层除了要有“为伊消得人憔悴衣带渐宽终不悔”的勇气和毅力还要悟 权限是什么无非就是要让没有权限的人不能访问没有授权的物那谁有权谁没权这就是权限的表示问题不管是01也好Table记录也罢文件配置也行最终都要告诉人--物的对应只能在有了这种对应之后我们的权限管控才是物有所托。 当然很多时候这两者不是直接对应的为了某种原因如更易管理更易写程式更易提供界面等等往往会设计一些中间过程如人会加到群组里面由群组来对应物物也可以组成群组但是不管中间多少层最终还是人与物的对应。最终要提供类似HasPermission(UserID,ResourceID)有无权限PermissionResource(UserID)用户权限资源PermissionUser(ResourceID)拥有资源权限的用户等方法。 有了权限的表示并不能阻止访问没有授权的资源它只是一个死物需要有地方去用它。这就是权限的管控它包括1.选择管控的地点即在哪里下手在哪里进行管控有通过PageLoad,有通过HttpModule还有通过AOP在方法调用前横切管控等等如果是资源权限则可能在资源下拉框中按权限筛选在提交时根据参数判断资源权限等等。 最终只要你记得这是管控的地点如何在系统中更简单更方便地管控取决于系统架构其灵活性也让管控地点的选择是否顺利与简单 2.管控过程分为四步a.识别出人cookieSession或者是c/s中的UserID变量也可以是webservice的soap头经过登录后的用户ID还可以是IP或者手机号码最终都转为权限表示中的UserIDb.识别出物Url,参数中的变量都行最终要转成权限表示中的ObjectIDc.调用HasPermission(人,物)判断权限这是由权限表示决定的方法d.实施管控策略对于无权限者或转向无权登录页或抛出异常或Button.Visible false最终实现权限管控 经过这个本质的识别接下来就可以来锻造真正的玄铁重剑了针对权限表示设计一个比较通用的方案也就是基本上能够通用的最简单抽象---------------------------------不吐不快插播一下在系统架构过程中如何快速实现可供用户测试和使用的系统才是最重要的至于一些底层服务框架如数据访问AOP横切IOC日志等并不是越完美越好而是要简单要在自己全部理解的基础上使用有了这个基础就算碰到不能实现某些需求时也可以很容易地通过自己修改去实现就说日志吧对于一些新手来说完全没必要去用log4net直接几行代码使用txt就完成日志记录了要不然在程式出错时除了要找寻程式为啥出错还可能要去找为什么没有日志出来还有如AOP先想想整体架构为什么需要AOPAOP何时使用如果使用spring.net,caslte就会出现只要一个轮子结果将整个汽车仓库都搬来了不是不好而是用不到用不到再好的东西也等于零关键是对于不熟悉的人一旦出现问题那维护起来也是相当麻烦当然以上只是适用于不太熟悉的人如果你对Castle或者log4net熟悉得就像老婆身上有哪几颗痣在什么地方都知道则另当别论好了拉回来不跑远了--------------------------------------1:Object,Group的对应2:User,Group的对应基本上这个简单的抽象就可以完成绝大部分权限表示问题如果真有幸碰到了剩下5%不能完成的权限表示时那就再去抽象一次最终提供权限表示上的权限方法就是对于权限方法也只需写一遍就可以用在任何权限类别上了复制几个权限配置的片段吧Ajax的权限--------------------------Role,Object--------------------------Admin,* ?,PCIWeb.ProgramsHelper.Programs ?,ClientTool.* ?,WebFileBrowser_CIFiles.*?,WebFileBrowser_PQM.*?,WebFileBrowser_ISO.* ?,MRB.BookingService.RoomBooking?,MRB.BookingService.RoomBookingAfterNow*,MRB.BookingService.Cancel*,MRB.BookingService.Booking --PQM系統PQM_Exced,PQM.ExcedService.*--7S,Lean,KaizenPQM_CI,PQM.CI 这是直接访问DB服务的权限 -------------------------- Role,Object--------------------------Admin,* ?,MRB/Room_Query?,MRB/Borrow_Query2 --任何人都可以查詢每日超標回饋表?,PQM/Exced_Query?,PQM/Excem_Query?,PQM/Excedd_Query?,PQM/Excem_Query2 这是User与Role的对应------------------------------User,Role------------------------------850.00,Admin 850.00,PQM_Exced206.00,PQM_Exced54.00,Admin54.00,PQM_Exced 其次对于管控地点不同的人的系统架构不同可能实现也不一样。笔者的系统架构采用RIA架构 SOA服务因此在服务层使用aop的横切方式就完成了服务权限的管控而数据权限也是抽象了几个UI控件通过PermissionResource方法过滤下拉列表框和弹出Grid而在服务调用时在具体的程式中直接调用HasPermission方法进行管控 融入剑本质的玄铁重剑出炉所向披靡这把剑与当初那把无名利剑表面上似乎没有什么不同但他的锻造过程更标准剑招也需要内力的支撑。举个例子来说通过URL管控可能只能用于Web而通过管控Button的Visible虽然能管控到WinForm但是WebService的权限怎么办 而明确了权限的本质后针对各种不同的部分统一或单独实现做到有的放矢不再盲目跟从。特别是如果自己的系统针对某一范围更能够实现一套符合自己的通用的权限架构。 有了这一层的实现后第三层的境界其实也是水到渠成这便是手中无剑心中有剑剑终究有形不管它多轻又或多通用到处带着始终会很累只要心中有剑就是手上拿着的是木剑也能杀人。 笔者所服务的部门留有很多旧系统里面各种权限实现五花八门加上移植兄弟公司的系统里面也有单独的权限实现对这一部分原来还想全部改写后来终于放下。只要实现目的管他什么手段只是与刚开始的漫无目的不同这时候已能十分清楚这些额外的权限是如何实现有无漏洞等等驾驭起来也是顺风顺水 其实mvc的controller管控也非常不错没有谁在这里做了漏网之鱼其实webform的control管控也运行稳定至今顺利在跑 存在即合理为什么要去改变他们为什么要花这么大心思去补救去重构生命中要做的事情太多太多 比权限管控更重要的事情也多得多如何让用户查起来更顺手如何让资料显示得更舒服如何让画面更流畅。。。资源管控住了就行管它用什么方法合适的就是最好的。如一个webservice系统总共就这么一个webservice只允许本机访问同一台主机不同系统的数据交换那就在方法中直接写if(HttpContext.Current.Request.UserHostAddress!127.0.0.1) throw new PermissionException(抱歉你没有访问这个web服务的权限); 这其中不也包括了权限表示hardcode在代码中就是用户为127.0.0.1才有权限管理地点:执行方法的主体代码前识别人: HttpContext.Current.Request.UserHostAddress识别物:就是当前管控的方法调用在这里是隐式的调用权限表示方法验证:HttpContext.Current.Request.UserHostAddress!127.0.0.1无权时的动作:throw new PermissionException(抱歉你没有访问这个web服务的权限)同样它就是一个标准的权限管控方案 信手拈来即是剑按照权限思路查看是否有漏洞有则补之无则放行 无剑一身轻 众里寻她千百度蓦然回首那人却在灯火阑珊处 转载于:https://www.cnblogs.com/yangfan/archive/2011/10/26/2225753.html