仓酷云

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

[学习教程] 来看Spring源代码剖析(十):Spring Acegi框架受权的完成

[复制链接]
谁可相欹 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:12:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
专门做了这个例子;而java的这个例子好像就是为了教学而写的,很多教学目的的例子是不考虑优化、性能的。
我们从FilterSecurityInterceptor我们从动手看看如何举行受权的:
Java代码
//这里是拦阻器拦阻HTTP哀求的出口
  publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)
    throwsIOException,ServletException{
    FilterInvocationfi=newFilterInvocation(request,response,chain);
    invoke(fi);
  }
//这是详细的拦阻挪用
  publicvoidinvoke(FilterInvocationfi)throwsIOException,ServletException{
    if((fi.getRequest()!=null)&&(fi.getRequest().getAttribute(FILTER_APPLIED)!=null)
      &&observeOncePerRequest){
     //在第一次举行过平安反省以后就不会再做了
      fi.getChain().doFilter(fi.getRequest(),fi.getResponse());
    }else{
      //这是第一次收到响应的哀求,必要做平安检测,同时把标记为设置好- FILTER_APPLIED,下次就再有哀求就不会作不异的平安反省了
      if(fi.getRequest()!=null){
        fi.getRequest().setAttribute(FILTER_APPLIED,Boolean.TRUE);
      }
      //这里是做平安反省的中央
      InterceptorStatusTokentoken=super.beforeInvocation(fi);
      //接着向拦阻器链实行
      try{
        fi.getChain().doFilter(fi.getRequest(),fi.getResponse());
      }finally{
        super.afterInvocation(token,null);
      }
    }
  }
我们看看在AbstractSecurityInterceptor是如何对HTTP哀求作平安检测的:
Java代码
protectedInterceptorStatusTokenbeforeInvocation(Objectobject){
    Assert.notNull(object,"Objectwasnull");
    if(!getSecureObjectClass().isAssignableFrom(object.getClass())){
      thrownewIllegalArgumentException("Securityinvocationattemptedforobject"
        +object.getClass().getName()
        +"butAbstractSecurityInterceptoronlyconfiguredtosupportsecureobjectsoftype:"
        +getSecureObjectClass());
    }
    //这里读取设置FilterSecurityInterceptor的ObjectDefinitionSource属性,这些属性设置了资本的平安设置
    ConfigAttributeDefinitionattr=this.obtainObjectDefinitionSource().getAttributes(object);
    if(attr==null){
      if(rejectPublicInvocations){
        thrownewIllegalArgumentException(
           "NopublicinvocationsareallowedviathisAbstractSecurityInterceptor."
          +"Thisindicatesaconfigurationerrorbecausethe"
          +"AbstractSecurityInterceptor.rejectPublicInvocationspropertyissettotrue");
      }
      if(logger.isDebugEnabled()){
        logger.debug("Publicobject-authenticationnotattempted");
      }
      publishEvent(newPublicInvocationEvent(object));
      returnnull;//nofurtherworkpost-invocation
    }
    if(logger.isDebugEnabled()){
      logger.debug("Secureobject:"+object.toString()+";ConfigAttributes:"+attr.toString());
    }
    //这里从SecurityContextHolder中往取Authentication对象,一样平常在登录时会放到SecurityContextHolder中往
    if(SecurityContextHolder.getContext().getAuthentication()==null){
      credentialsNotFound(messages.getMessage("AbstractSecurityInterceptor.authenticationNotFound",
          "AnAuthenticationobjectwasnotfoundintheSecurityContext"),object,attr);
    }
    //假如后面没有处置鉴权,这里必要对鉴权举行处置
    Authenticationauthenticated;
    if(!SecurityContextHolder.getContext().getAuthentication().isAuthenticated()||alwaysReauthenticate){
      try{//挪用设置好的AuthenticationManager处置鉴权,假如鉴权不成功,抛出非常停止处置
        authenticated=this.authenticationManager.authenticate(SecurityContextHolder.getContext()
                                              .getAuthentication());
      }catch(AuthenticationExceptionauthenticationException){
        throwauthenticationException;
      }
      //Wedontauthenticated.setAuthentication(true),becauseeachprovidershoulddothat
      if(logger.isDebugEnabled()){
        logger.debug("SuccessfullyAuthenticated:"+authenticated.toString());
      }
      //这里把鉴权乐成后失掉的Authentication保留到SecurityContextHolder中供下次利用
      SecurityContextHolder.getContext().setAuthentication(authenticated);
    }else{//这里处置后面已经由过程鉴权的哀求,先从SecurityContextHolder中往获得Authentication
      authenticated=SecurityContextHolder.getContext().getAuthentication();
      if(logger.isDebugEnabled()){
        logger.debug("PreviouslyAuthenticated:"+authenticated.toString());
      }
    }
    //这是处置受权的历程
    try{
      //挪用设置好的AccessDecisionManager来举行受权
      this.accessDecisionManager.decide(authenticated,object,attr);
    }catch(AccessDeniedExceptionaccessDeniedException){
      //受权不乐成向外公布事务
      AuthorizationFailureEventevent=newAuthorizationFailureEvent(object,attr,authenticated,
          accessDeniedException);
      publishEvent(event);
      throwaccessDeniedException;
    }
    if(logger.isDebugEnabled()){
      logger.debug("Authorizationsuccessful");
    }
    AuthorizedEventevent=newAuthorizedEvent(object,attr,authenticated);
    publishEvent(event);
    //这里构建一个RunAsManager来替换以后的Authentication对象,默许情形下利用的是NullRunAsManager会把SecurityContextHolder中的Authentication对象清空
    AuthenticationrunAs=this.runAsManager.buildRunAs(authenticated,object,attr);
    if(runAs==null){
      if(logger.isDebugEnabled()){
        logger.debug("RunAsManagerdidnotchangeAuthenticationobject");
      }
      //nofurtherworkpost-invocation
      returnnewInterceptorStatusToken(authenticated,false,attr,object);
    }else{
      if(logger.isDebugEnabled()){
        logger.debug("SwitchingtoRunAsAuthentication:"+runAs.toString());
      }
      SecurityContextHolder.getContext().setAuthentication(runAs);
      //reverttotoken.Authenticatedpost-invocation
      returnnewInterceptorStatusToken(authenticated,true,attr,object);
    }
  }
<p>
令人可喜的是java现在已经开源了,所以我想我上述的想法也许有一天会实现,因为java一直都是不断创新的语言,每次创新都会给我们惊喜,这也是我喜欢java的一个原因。
活着的死人 该用户已被删除
沙发
发表于 2015-1-20 17:06:47 | 只看该作者
有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想)
冷月葬花魂 该用户已被删除
板凳
发表于 2015-1-29 13:16:12 | 只看该作者
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
柔情似水 该用户已被删除
地板
发表于 2015-2-5 20:15:28 | 只看该作者
如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。
乐观 该用户已被删除
5#
发表于 2015-2-6 16:32:12 | 只看该作者
Java 编程语言的风格十分接近C、C++语言。
小妖女 该用户已被删除
6#
发表于 2015-2-7 15:59:16 | 只看该作者
多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。
第二个灵魂 该用户已被删除
7#
发表于 2015-2-9 20:11:10 | 只看该作者
[url]http://www.jdon.com/[/url]去下载,或到同济技术论坛的服务器[url]ftp://nro.shtdu.edu.cn[/url]去下,安装上有什么问题,可以到论坛上去提问。
灵魂腐蚀 该用户已被删除
8#
发表于 2015-2-10 20:51:51 | 只看该作者
Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。
若天明 该用户已被删除
9#
发表于 2015-3-1 13:48:35 | 只看该作者
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
金色的骷髅 该用户已被删除
10#
发表于 2015-3-4 23:13:25 | 只看该作者
如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。
不帅 该用户已被删除
11#
发表于 2015-3-7 04:19:36 | 只看该作者
还好,SUN提供了Javabean可以把你的JSP中的 Java代码封装起来,便于调用也便于重用。
小魔女 该用户已被删除
12#
发表于 2015-3-14 09:51:45 | 只看该作者
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
老尸 该用户已被删除
13#
发表于 2015-3-21 01:38:39 | 只看该作者
让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-15 05:14

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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