2012-03-20 82 views
31

我已经定义了以下豆:什么是Spring-Security中的默认AuthenticationManager?它如何进行身份验证?

<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(...)为了进行身份验证(即确保用户名与密码匹配)。

你能解释一下吗?

回答

39

AuthenticationManager实际上只是认证提供程序的容器,为它们提供了一致的界面。在大多数的情况下,默认AuthenticationManager绰绰有余。

当你调用

.authenticate(new UsernamePasswordAuthenticationToken(username, password))` 

它传递UsernamePasswordAuthenticationToken到默认AuthenticationProvider,它将使用userDetailsService获得基于用户名的用户,并与一个在认证令牌比较该用户的密码。

一般来说,AuthenticationManager通过某种AuthenticationToken到每一个它的AuthenticationProviders,他们每个检查它,如果他们可以用它来进行身份验证,他们与“认证”的指示返回,“未验证”,或“无法验证”(表示提供者不知道如何处理令牌,因此它在处理它时传递)

这是允许您插入其他验证方案的机制,例如针对LDAP进行验证或Active Directory服务器或OpenID,并且是Spring Security框架中的主要扩展点之一。

+2

这并不回答问题的最具体部分:“AuthenticationManager'接口的默认实现的名称是什么? @拉尔夫的回答如下。 ('org.springframework.security.authentication.ProviderManager') – 2016-03-03 15:44:33

+2

由于只有一个真正的'AuthenticationManager',我专注于问题的核心,即“认证'做什么?”,这需要一些背景介绍如何春天放在一起。总的来说,我发现,涵盖导致问题背景的丰富答案比回答特定问题更有用。 – cdeszaq 2016-03-07 21:40:02

20

Spring Security的船只只有一个真正的AuthenticationManager实现:

org.springframework.security.authentication.ProviderManager 

它使用不同AuthenticationProvider的身份验证任务

AuthenticationManagerBeanDefinitionParser负责解析<sec:authentication-manager>其Java doc的状态:

注册命名空间 使用的中央ProviderManager配置,并允许配置别名,允许 用户在其bean中引用它,并清楚地看到名称是来自哪里的 。

它创建ProviderManager并添加指定的提供。如果在xml中没有指定提供,那么它将添加一个NullAuthenticationProvider。这至少是一个注意事项,而不是防止配置异常。

+0

这是正确的答案。 – smeeb 2017-12-30 15:04:53

相关问题