繁体   English   中英

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

[英]What is the default AuthenticationManager in Spring-Security? How does it authenticate?

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

你能解释一下吗?

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

你打电话的时候

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

它将UsernamePasswordAuthenticationToken传递给默认的AuthenticationProvider ,后者将使用userDetailsService根据用户名获取用户,并将该用户的密码与身份验证令牌中的密码进行比较。

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

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

Spring Security仅提供一个真正的AuthenticationManager实现:

org.springframework.security.authentication.ProviderManager

这使用不同的AuthenticationProvider进行身份验证任务

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

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

它创建ProviderManager并添加指定的提供。 如果在xml中未指定NullAuthenticationProvider ,则会添加NullAuthenticationProvider 这至少是一个注意到阻止配置异常的提供者。

来自Spring Security Docs

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

有关ProviderManager的信息也可以在主题指南 - Spring Security Architecture中找到

AuthenticationManager最常用的实现是ProviderManager ,它委托一系列AuthenticationProvider实例。 AuthenticationProvider有点像AuthenticationManager,但它有一个额外的方法允许调用者查询它是否支持给定的身份验证类型...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM