我定义了以下bean:
<sec:authentication-manager alias="authenticationManager">
<sec:authentication-provider
user-service-ref="userDetailsService" />
</sec:authentication-manager>
我猜这里Spring使用AuthenticationManager
的一些默认实现。
在我的Java代码中,我有:
@Resource(name = "authenticationManager")
private AuthenticationManager authenticationManager; // specific for Spring Security
public boolean login(String username, String password) {
try {
Authentication authenticate = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(username, password));
if (authenticate.isAuthenticated()) {
SecurityContextHolder.getContext().setAuthentication(authenticate);
return true;
}
}
catch (AuthenticationException e) {
}
return false;
}
此处调用AuthenticationManager.authenticate(...)
。但是我想知道默认情况下AuthenticationManager
Spring使用哪种实现,以及authenticate(...)
为了进行身份验证所做的事情(即确保用户名与密码匹配)。
你能解释一下吗?
答案 0 :(得分:61)
AuthenticationManager
实际上只是身份验证提供程序的容器,为它们提供了一致的接口。在大多数案例中,默认AuthenticationManager
绰绰有余。
致电时
.authenticate(new UsernamePasswordAuthenticationToken(username, password))`
它将UsernamePasswordAuthenticationToken
传递给默认AuthenticationProvider
,默认userDetailsService
将使用AuthenticationManager
根据用户名获取用户,并将该用户的密码与身份验证令牌中的密码进行比较。
一般情况下,AuthenticationToken
会将某种AuthenticationProviders
传递给每个{{1}},然后他们会检查它们,如果他们可以使用它进行身份验证,他们会返回“Authenticated”,“Unauthenticated”或“Not not authenticate”的指示(表示提供者不知道如何处理令牌,因此它传递了处理它)
这是允许您插入其他身份验证方案的机制,例如针对LDAP或Active Directory服务器或OpenID进行身份验证,并且是Spring Security框架中的主要扩展点之一。
答案 1 :(得分:31)
Spring Security只发布了一个真正的AuthenticationManager
实现:
org.springframework.security.authentication.ProviderManager
这对身份验证任务使用不同的AuthenticationProvider
AuthenticationManagerBeanDefinitionParser
负责解析{doc}状态的<sec:authentication-manager>
:
注册命名空间使用的中央ProviderManager 配置,并允许配置别名,允许 用户在他们的bean中引用它并清楚地看到名称的位置 来自。
它创建ProviderManager
并添加指定的提供。如果在xml中未指定provide,则会添加NullAuthenticationProvider
。这至少是一个提供者,而不是防止配置异常。
答案 2 :(得分:0)
Spring Security中的默认实现称为 ProviderManager ,它不处理身份验证请求本身,而是委派给已配置的 AuthenticationProvider 的列表,每个列表都被查询依次查看它是否可以执行身份验证。每个提供程序都将引发异常或返回完全填充的 Authentication 对象。
有关 ProviderManager 的信息也可以在Topical Guide - Spring Security Architecture中找到:
AuthenticationManager 的最常用实现是 ProviderManager ,它委派给 AuthenticationProvider 链 实例。 AuthenticationProvider 有点像 AuthenticationManager ,但它具有允许调用者使用的其他方法 查询它是否支持给定的 Authentication 类型...