快速业务通道

Spring源代码解析(九):Spring Acegi框架鉴权的实现 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17
ername attempted into HttpSession for views      request.getSession().setAttribute(ACEGI_SECURITY_LAST_USERNAME_KEY, username);      // Allow subclasses to set the "details" property      setDetails(request, authRequest);      //这里启动AuthenticationManager进行验证过程      return this.getAuthenticationManager().authenticate (authRequest);    }

Spring源代码解析(九):Spring Acegi框架鉴权的实现(2)

时间:2011-03-29 javaeye jiwenke

在Acegi框架中,进行验证管理的主要类是AuthenticationManager,我们看看它是怎样 进行验证管理的 - 验证的调用入口是authenticate在AbstractAuthenticationManager的 实现中:

//这是进行验证的函数,返回一个Authentication对象来记录验证的结果,其中包含 了用户的验证信息,权限配置等,同时这个Authentication会以后被授权模块使用

Java代码

//如果验证失败,那么在验证过程中会直接抛出异常    public final Authentication authenticate(Authentication authRequest)      throws AuthenticationException {      try {//这里是实际的验证处理,我们下面使用ProviderManager来说明具体 的验证过程,传入的参数authRequest里面已经包含了从HttpServletRequest中得到的用 户输入的用户名和密码        Authentication authResult = doAuthentication(authRequest);        copyDetails(authRequest, authResult);        return authResult;      } catch (AuthenticationException e) {        e.setAuthentication(authRequest);        throw e;      }    }

在ProviderManager中进行实际的验证工作,假设这里使用数据库来存取用户信息:

Java代码

public Authentication doAuthentication(Authentication authentication)      throws AuthenticationException {      //这里取得配置好的provider链的迭代器,在配置的时候可以配置多个 provider,这里我们配置的是DaoAuthenticationProvider来说明, 它使用数据库来保存用 户的用户名和密码信息。      Iterator iter = providers.iterator();      Class toTest = authentication.getClass();      AuthenticationException lastException = null;      while (iter.hasNext()) {        AuthenticationProvider provider = (AuthenticationProvider) iter.next();        if (provider.supports(toTest)) {          logger.debug("Authentication attempt using " + provider.getClass().getName());          //这个result包含了验证中得到的结果信息          Authentication result = null;          try {//这里是provider进行验证处理的过程            result = provider.authenticate(authentication);            sessionController.checkAuthenticationAllowed(result);          } catch (AuthenticationException ae) {            lastException = ae;            result = null;          }          if (result != null) {            sessionController.registerSuccessfulAuthentication (result);            publishEvent(new AuthenticationSuccessEvent(result));            return result;          }        }      }      if (lastException == null) {     

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号