版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料第8章 利用aop实现应用的安全验证(第1/2部分)应用系统中的身份验证技术实现是企业应用系统中必须提供的一个普通的功能,其常规的技术实现方式为:对于j2ee web应用系统采用过滤器组件技术或者设计和实现一个控制层组件的基类,而对于j2ee ejb组件的应用系统一般可以应用j2ee应用服务器容器来实现安全验证。对于应用过滤器组件技术的实现方案,由于过滤器是针对url地址而实施的,因此也只适用应用系统的表示层组件;而应用控制层组件的基类方法,则会导致应用系统的业务功能的实现代码与安全验证功能的代码混杂在一起,两者存在紧密的耦合性,从而导致
2、应用系统的可扩展性比较低。而如果应用j2ee应用服务器容器来实现安全验证,不仅使得应用系统缺少灵活性和可扩展性,而且应用系统也将会完全依赖于j2ee规范和某种应用服务器容器的具体实现;另外也需要j2ee应用系统组件的开发者对j2ee容器的具体技术实现策略和j2ee标准规范有足够的了解。而在spring 框架中提供了多种不同形式的权限控制和身份验证技术的具体实现和支持,当然其中以应用spring 框架aop技术的实现方案为最佳。本章将介绍常规的身份验证技术实现,并分析其优缺点,然后再介绍spring 框架中提供的多种不同形式的身份验证技术的具体实现;最后进行对比并总结各种实现方式的差别、应用的场
3、合和优缺点。 1.1 应用系统中的身份验证技术实现1.1.1 常规的技术实现1、利用过滤器(filter)组件技术(1)该方案的实现原理利用过滤器组件实现对应用系统中的特定请求的url地址进行拦截和解析,并识别是否为对敏感资源进行的请求。如果是,则再进一步识别请求的用户此时的身份状态信息(一般是从httpsession对象中获得记录身份状态信息的实体组件类userinfovo的对象信息),然后再通过rbac(roled-based access control)的机制,将此链接需要的访问权限与当前访问的用户拥有的权限进行比较,然后进行相应的访问控制处理。(2)实现的示例请见本书的【例6-4】中
4、所给出的利用过滤器组件类checkuserloginfilter的代码实现示例。(3)利用过滤器组件方法实现时的优缺点其主要的优点是实现简单,并且过滤器组件对系统的侵入性也不高,因为过滤器组件与正常的控制层组件servlet是相互分离的。当然在此所涉及的请求的目标url也就是rbac中的访问控制的目标资源。但应用过滤器组件方法的主要缺点是只能通过url地址来反映被监控的目标资源,而在一般的应用系统中经常会采用同一个url地址来代表实现多项不同的功能请求。此时,将会导致在过滤器组件类需要对url中的查询字符串再进一步识别和区分,增加过滤器组件类的编程的复杂度(请参考本书的【例6-4】中check
5、userloginfilter类的代码)。另外,由于过滤器组件方法只能够监控url,也就是只能对表示层组件中相关的方法进行拦截,而不能实现对应用系统中的业务层或者持久层中的dao组件中的方法进行拦截。而在很多应用中需要的是对系统的底层组件中的方法的调用状态进行拦截,此时采用过滤器的方法可能将无能为力。2、设计和实现一个控制层组件的基类(1)该方案实现的基本原理 在web应用系统的开发中,除了可以应用前面所介绍的过滤器组件方法实现身份验证技术之外。也可以通过设计和实现一个控制层组件的基类,应用系统的控制层组件类则从该基类来继承。也就是对于采用标准的j2ee web组件技术实现的应用系统而言,可以
6、设计一个servlet组件的基类;而对于采用struts框架技术实现的应用系统而言,则是设计一个action组件的基类。在该控制层组件的基类代码中,可以实现更为细致的身份验证功能。在下面的【例81】中,给出了一个基于标准的servlet组件基类的代码实现示例。并请注意其中的黑体部分的代码,为了减少本书的篇幅,除掉了其它无关的部分代码。【例81】设计和实现一个控制层组件基类的代码示例public class checkuseraction extends httpservletpublic boolean checkusertype (httpsession onesession)/ 。在此进行
7、用户身份验证技术实现public class xxxservlet extends checkuseractionpublic void doget(httpservletrequest request, httpservletresponseresponse)throws servletexception,ioexception httpsession onesession= request.getsession();if (!checkusertype (onesession) throw new servletexception (您无此权限,将不能对此功能进行请求!); /。 如果身份
8、合法将允许该用户进行请求访问 (2)该方法的优缺点这种实现方法,其实也是对用户的特定请求先进行权限过滤操作,然后再依据用户的身份进行验证处理。因此与采用前面所描述的过滤器组件技术的实现并无本质不同。其优缺点基本上也同前面的利用过滤器组件技术,另外这种在控制层组件中加入身份验证的实现方式,将导致应用系统的业务功能的实现代码与安全验证功能的代码混杂在一起,两者存在紧密的耦合性,从而导致应用系统的可扩展性比较低。3、利用j2ee技术规范中的j2ee容器实现安全验证(1)利用j2ee容器实现安全验证在j2ee规范中其实也已经提供了关于权限控制的容器实现的标准,从而改变了原来需要由每个应用程序实现的权限
9、控制转变为由j2ee 容器来实现。并且j2ee规范要求j2ee的应用服务器产品的提供商必须为应用系统的开发者提供两种形式的基于j2ee容器的安全性支持:说明性的安全性(将安全策略在部署的描述文件中定义)和可编程的安全性(要求程序员通过编码来保证j2ee的安全性)。(2)j2ee标准规范中所规定的三种基于web客户端的验证方式1) http基本验证(http basic authentication) 2) 基于表单的验证(form-based authentication) 3) 基于客户端证书的验证(client-certificate authentication)(3)相关的主要apij
10、2ee在ejb 组件技术中的ejbcontext接口和web组件的httpservletrequest类中各提供了下面的主要方法:1) iscallerinrole (在ejbcontext接口中) 2) getcallerprincipal (在ejbcontext接口中) 3) isuserinrole (在httpservletrequest类中) 4) getuserprincipal (在httpservletrequest类中) 这些方法将允许组件的开发者根据调用者或远程用户的安全角色来作出商业判断,以决定是否允许该用户能够访问本组件。(4)在web应用系统中应用可编程的安全性的示
11、例代码l web应用系统中的某个servlet组件的代码实现示例请见下面的【例82】中所示并请注意其中的黑体部分的代码。为了减少篇幅,除掉了其它无关的部分代码。【例82】 web应用系统中的某个servlet组件的代码实现示例public class checkuseraction extends httpservletpublic void doget(httpservletrequest request, httpservletresponse response)throws servletexception, ioexception /识别请求者是否属于webuser安全角色if (!r
12、equest.isuserinrole(webuser) throw new servletexception (您无此权限,将不能对此功能进行请求!);/。 如果身份合法将允许该用户进行请求访问l web应用系统中的web.xml文件中的内容示例请见下面的【例83】所示并请注意其中的黑体部分的代码。为了减少篇幅,除掉了其它无关的部分代码。【例83】 web应用系统中的web.xml文件中的内容示例web-app version=2.4 xmlns= xmlns:xsi=/2001/xmlschema-instance xsi:schemalocation= /
13、 . 其它的标签sensitiveresources a collection of sensitive resources /protecteddirone/index.jsp/protecteddirtwo/index.jsp/protecteddirthree/index.jspgetpost webuser basic default this is a user webuser/ . 其它的标签从上面的web.xml文件的内容中可以看出,只有安全角色为“webuser”的用户才能对特定的资源,也就是目标页面文件进行访问操作。(5)利用j2ee容器实现安全验证的主要优点非常明显,通过容
14、器实现安全控制验证可以大大地简化应用系统中的安全部分的程序模块的设计和编程实现,同时也分离了应用系统的权限关注,将权限控制变成了对j2ee容器服务器的配置工作和容器所提供的基础服务功能。(6)利用j2ee容器实现安全验证的主要缺点l 应用系统缺少灵活性和可扩展性利用容器实现的权限验证也是一种从一个切面来解决问题的方式,其实也是aop思想的具体应用和实现。但权限控制在j2ee容器级别中的实现却使得j2ee应用系统组件的开发者缺少灵活性和可扩展性,因为完全依赖于和受制于j2ee容器的具体技术实现策略。l j2ee应用系统组件的开发者需要对j2ee容器的具体技术实现策略和j2ee标准规范有足够的了解
15、这对普通的开发者而言,将会增加一定的技术实现的难度。1.1.2 利用spring 框架aop的技术实现1、利用spring aop实现应用系统中的权限控制利用aop实现分离关注,这样将可以实现将应用系统的核心关注点的功能实现代码和横切关注点的功能实现代码相互分开,最后将可以实现在应用系统的业务功能代码中将不再混杂有额外的权限操作的代码。将使得业务功能的实现方法非常简洁,并达到分离业务功能实现与安全验证功能实现的目标。在下面的【例84】的代码示例中,主要是应用了spring aop技术来实现权限控制的代码示例。为了减少本书的篇幅,除掉了其它无关的部分代码。【例84】利用spring aop实现权
16、限控制的某个struts的action组件类的代码示例 package com.px1987.webshop.control.action;/ import 各个相关的包及类.public class pageforwordaction extends dispatchaction public actionforward godoupdateuserinfo(actionmapping mapping,actionform form,httpservletrequest request,httpservletresponse response)/ . 实现业务功能的调度代码 return m
17、apping.findforward(godoupdateuserinfo);/. 其它的方法定义2、利用spring 框架aop技术实现权限控制的两种实现形式(1)如果web应用系统采用spring mvc 框架实现则可以利用拦截器(handlerinterceptor)技术来实现权限控制,因为spring mvc框架的处理器(controller)映射支持拦截器。当开发者想要为某些请求提供特殊功能时,例如对用户进行身份验证,此时就可以应用该拦截器组件技术。但处理器映射中的拦截器组件必须实现org.springframework.web.servlet包中的handlerintercepto
18、r接口。当然,在spring框架中还提供了一个适配器形式的组件类handlerinterceptoradapter组件,让开发者能够更方便地实现handlerinterceptor接口。在该handlerinterceptor接口中定义了三个方法,一个在处理器执行前被调用(prehandle),一个在处理器执行后被调用(posthandle),另一个在整个请求处理完后调用(aftercompletion)。在下面的【例85】中给出了handlerinterceptor接口的定义示例。【例85】org.springframework.web.servlet包中的handlerintercepto
19、r接口的定义示例public interface handlerinterceptorvoid aftercompletion(httpservletrequest request, httpservletresponse response, object handler, exception ex) ; void posthandle(httpservletrequest request, httpservletresponseresponse, object handler, modelandview modelandview) ; boolean prehandle(httpservle
20、trequest request, httpservletresponseresponse,object handler) ;这三个方法为开发者提供了足够的灵活度以做任何处理前/后等形式的操作。而其中的prehandle()方法有一个boolean类型的返回值。使用这个返回值,开发者可以调整执行链的行为。当返回为true时,处理器执行链将继续执行;而当返回为false时,dispatcherservlet认为该拦截器已经处理完了请求(比如显示正确的视图),而将不再继续执行执行链中的其它拦截器和处理器。(2)如果web应用系统不采用spring mvc 框架实现此时则可以将对权限的操作设计为一个
21、前置通知组件,该前置通知组件按照spring 框架中的aop的实现要求实现org.springframework.aop.methodbeforeadvice接口,并将该前置通知组件关注到特定的业务组件类中的敏感业务方法中。通过这样的分离达到了将应用系统的核心关注点与横切关注点之间的相互分离的目的,纵向的业务功能组件被分割为一个更为自然的业务功能组件和一个横切关注点的功能组件。实现此功能的这个前置通知组件的代码示例请见下面的【例86】中所示,并请注意其中的黑体部分的代码。为了减少本书的篇幅,除掉了其它无关的部分代码。【例86】 某个前置通知组件checkuserloginstateadvice
22、类的代码示例package com.px1987.webshop.control.aop;import java.lang.reflect.method;import javax.servlet.http.httpservletrequest;import javax.servlet.http.httpsession;import org.apache.struts.action.actionmapping;import org.springframework.aop.methodbeforeadvice;import com.px1987.webshop.service.serviceexc
23、eption;public class checkuserloginstateadvice implements methodbeforeadvice public checkuserloginstateadvice() public void before(method targetmethod, object methodargs, object targetclass)throws throwable httpservletrequest request=(httpservletrequest)methodargs2;httpsession session=request.getsess
24、ion();string actiontype=request.getparameter(actiontype);boolean ischeckmethodname=(actiontype.equals(godoupdateuserinfo)|actiontype.equals(godouserlogout);if(ischeckmethodname&(session.getattribute(oneuserinfovo)=null) throw new serviceexception(您所在的用户组没有此操作的权限,或者您还没有登录);3、利用spring mvc框架中的拦截器组件技术实现
25、身份验证的权限控制示例(1)在项目中添加一个拦截器组件该拦截器组件的类名称为userlogininterceptor,包名称为com.px1987.webbbs.aop,并从适配器org.springframework.web.servlet.handler.handlerinterceptoradapter类继承。请见下面的图8.1中所示的输入参数的要求。图8.1在项目中添加一个拦截器组件类userlogininterceptor的对话框(2)编程该拦截器组件userlogininterceptor类的实现代码请见下面的【例87】中所示的代码,并请注意其中的黑体部分的代码。为了减少本书的篇幅
26、,除掉了其它无关的部分代码并简化了部分实现的代码。【例87】 拦截器组件userlogininterceptor类的代码示例package com.px1987.webbbs.aop;import org.springframework.web.servlet.handler.handlerinterceptoradapter;import javax.servlet.http.httpservletrequest;import javax.servlet.http.httpservletresponse;import org.springframework.web.servlet.modelandview;import com.px1987.webbbs.actionform.*;public class userlogininterceptor extends handlerinterceptoradapter public userlogininterceptor() public boolean prehandle(h
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 优惠合同协议的意义
- 全新电脑购销意向
- 教官发展服务合同
- 公路工程招标文件的标准范本
- 育肥猪购销协议
- 有机纱线购销合同
- 招标文件范本摇号定标的合同条款
- 童装采购合同
- 代理招商合作合同定制
- 个人工作保安全
- 湖北省咸宁市通城县2022-2023学年八年级上学期期末质量检测数学试卷(含解析)
- 【MOOC】法理学-西南政法大学 中国大学慕课MOOC答案
- 2024年新湘教版七年级上册数学教学课件 第4章 图形的认识 章末复习
- 2024年民用爆炸物品运输合同
- 国家开放大学24237丨学前儿童语言教育活动指导(统设课)期末终考题库及答案
- 2024-2030年中国离合器制造行业运行动态及投资发展前景预测报告
- 【MOOC】大学生创新创业教育-云南大学 中国大学慕课MOOC答案
- 《个体防护装备安全管理规范AQ 6111-2023》知识培训
- 客户管理系统技术服务合同
- 北京交通大学《成本会计》2023-2024学年第一学期期末试卷
- 治疗皮肤病药膏市场需求与消费特点分析
评论
0/150
提交评论