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) {
|