AuthenticationManager是认证核心接口,其作用是验证客户端输入端用户名是否正确
这个接口只有一个方法
public Authentication authenticate(Authentication authentication)
throws AuthenticationException;
这个方法就是去验证用户名 密码时候正确,那么用户名密码在那儿呢?封装在Authentication 类中,这样在authenticate()方法中就可取到用户名密码然后去验证。
验证用户名密码的方式是多种多样的如 Dao验证 ldap验证,被称为AuthenticationProvider,这些provider只要有一个验证通过就认为验证成功。(从别处看来的,未验证)
AuthenticationManager有一个子类ProviderManager,用来管理这些provider
其采用循环方式执行每个provider
while (iter.hasNext()) {
AuthenticationProvider provider = (AuthenticationProvider) iter.next();
if (provider.supports(toTest)) {
logger.debug("Authentication attempt using " + provider.getClass().getName());
Authentication result = null;
try {
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;
}
}
}
循环完后,认证结束 返回了一个Authentication实例, 这个Authentication实例跟作为参数传进去的实例有什么不同呢?
看下面的代码
public final Authentication authenticate(Authentication authRequest)
throws AuthenticationException {
try {
Authentication authResult = doAuthentication(authRequest);
copyDetails(authRequest, authResult);
return authResult;
} catch (AuthenticationException e) {
e.setAuthentication(authRequest);
throw e;
}
}
这段代码还是不能看到两个authResult 和authRequest的不同
看下面的代码
protected Authentication createSuccessAuthentication(Object principal, Authentication authentication,
UserDetails user) {
// Ensure we return the original credentials the user supplied,
// so subsequent attempts are successful even with encoded passwords.
// Also ensure we return the original getDetails(), so that future
// authentication events after cache expiry contain the details
UsernamePasswordAuthenticationToken result = new UsernamePasswordAuthenticationToken(principal,
authentication.getCredentials(), user.getAuthorities());
result.setDetails(authentication.getDetails());
return result;
}
可以看到Credentials又被作为结果的一部分返回 。
user.getAuthorities是取得用户的权限
principal封装用户名 email等一些用户信息
值得注意的是这句,将传进来的details数据当作结果的一部分返回
result.setDetails(authentication.getDetails());
还有这句
copyDetails(authRequest, authResult);
private void copyDetails(Authentication source, Authentication dest) {
if ((dest instanceof AbstractAuthenticationToken) && (dest.getDetails() == null)) {
AbstractAuthenticationToken token = (AbstractAuthenticationToken) dest;
token.setDetails(source.getDetails());
}
}
参数中的details又被重新设置到结果中并返回,如果在验证过程中details没有改变。。。。
这个details到底是干什么用的呢? 今天先写到这儿 明天再研究
分享到:
相关推荐
#### 四、Acegi认证流程解析 Acegi的认证流程主要包括以下几个步骤: 1. **提交凭证**:用户通过表单或API提交登录凭证,如用户名和密码。 2. **验证凭证**:Acegi通过`AuthenticationManager`接口来验证凭证的...
在`YourUserDetailsService`中,你需要实现`UserDetailsService`接口,提供一个方法`loadUserByUsername(String username)`,该方法会由Acegi在认证过程中调用,用于查找指定用户名的用户信息。 最后,为了使Basic...
4. **AuthenticationManager**(认证管理器): 负责处理用户的认证过程。它接受Authentication对象作为输入,并返回经过认证的Authentication对象作为输出。 5. **AccessDecisionManager**(访问决策管理器): 根据...
**认证(Authentication)**是验证用户身份的过程,Acegi Security支持多种认证机制,包括: 1. **HTTP基本认证**:基于IETF RFC标准,通过HTTP头部传递用户名和密码。 2. **HTTP摘要认证**:同样基于IETF RFC标准...
Acegi还提供了丰富的接口和类,允许开发者自定义认证和授权流程,例如创建自定义的`UserDetailsService`来从数据源加载用户信息,或者实现自定义的`AuthenticationProvider`以支持特定的认证逻辑。 尽管Spring ...
3. **AuthenticationManager**:负责验证由ContextHolder持有的Authentication对象,是整个认证过程的核心。 4. **AccessDecisionManager**:用于决策特定操作的访问权限,基于用户的授权信息。 5. **RunAsManager...
Acegi Security(现已被Spring Security替代)是一个功能强大的安全框架,它主要解决了认证(Authentication)和授权(Authorization)这两个核心的安全问题。 首先,让我们理解认证和授权的基本概念: - **认证**...
"Acegi认证授权流程.txt"很可能是对Acegi中认证和授权流程的文本描述,包括用户请求的处理流程、权限检查、会话管理等。掌握这个流程对于调试和优化安全设置至关重要。 总的来说,这个合集提供了一个全面的学习路径...
2. **授权(Authorization)**:在Acegi中,授权是指确定一个已认证的用户是否有权限访问特定的资源或执行某些操作。它可以基于角色、URL、方法或者更复杂的规则进行控制。 3. **会话管理(Session Management)**...
在Acegi Security与CAS的整合中,CAS负责用户的认证过程,即验证用户的身份;而Acegi Security则负责后续的应用程序授权,即确定用户可以访问哪些资源。这种分工明确的设计模式,既简化了开发者的集成工作,又提高了...
此文档涵盖了从安装CAS服务器,配置AceGI安全策略,到在Java客户端中设置认证和授权的全过程。 0.3 读者对象: 适合对AceGI和CAS有基本认识,需要在项目中实现安全策略整合的开发人员和系统架构师。 0.4 参考文献...
Acegi支持多种认证机制,包括基于表单的登录、HTTP基本认证和digest认证等。开发者可以通过自定义认证提供者来扩展这些机制。 2. **授权**:授权决定了哪些用户或角色可以访问特定的资源或执行特定的操作。Acegi...
1. **认证过程**: - 用户尝试访问受保护的资源。 - Acegi拦截请求,检查请求中是否包含有效的身份凭证,如用户名和密码。 - 身份验证提供者(如`AuthenticationProvider`)对凭证进行验证,例如通过查询数据库...
6. **jar.GIF 和 result.GIF**:这些可能是教程中的辅助图形,可能展示了配置步骤或者运行结果,帮助理解Acegi的工作流程。 总的来说,这个示例工程将展示如何在Spring环境中配置Acegi,创建用户、角色和权限,以及...
这涉及到数据库查询,以及如何将这些查询与Acegi的认证过程整合。 4. **加密**:在存储和传输敏感数据(如密码)时,Acegi提供加密服务。它使用安全哈希函数和盐值来加密密码,确保即使数据被窃取,也无法轻易解密...
最后,"acegi的认证过滤器.rar"是一个压缩包,很可能包含了开发者自己整理的关于Acegi认证过滤器的源代码或配置示例。这些过滤器是Acegi实现其安全功能的关键部分,它们在HTTP请求进入应用程序之前进行拦截,执行...
当用户请求到达服务器时,Acegi的过滤器链会检查请求,执行认证和授权过程。如果用户未认证或无权访问,Acegi将阻止请求,返回相应的错误信息。 3. **会话管理**: Acegi提供了一套完整的会话管理策略,包括会话...
Acegi的安全控制流程可以类比于乘飞机的过程:安检对应身份认证,登机对应资源访问控制,按号就座则对应领域对象的安全控制。通过这种方式,Acegi确保了只有经过认证的用户才能访问相应的资源,并且他们的操作权限...