Spring-Security中的默认AuthenticationManager是什么?它是如何验证的?

时间:2012-03-20 13:09:36

标签: spring spring-security

我定义了以下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(...)为了进行身份验证所做的事情(即确保用户名与密码匹配)。

你能解释一下吗?

3 个答案:

答案 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 Docs

  

Spring Security中的默认实现称为 ProviderManager ,它不处理身份验证请求本身,而是委派给已配置的 AuthenticationProvider 的列表,每个列表都被查询依次查看它是否可以执行身份验证。每个提供程序都将引发异常或返回完全填充的 Authentication 对象。

有关 ProviderManager 的信息也可以在Topical Guide - Spring Security Architecture中找到:

  

AuthenticationManager 的最常用实现是    ProviderManager ,它委派给 AuthenticationProvider 链   实例。 AuthenticationProvider 有点像    AuthenticationManager ,但它具有允许调用者使用的其他方法   查询它是否支持给定的 Authentication 类型...