Spring security authentication-manager 没有提供者

Spring security authentication-manager has no providers

我正在尝试设置一个具有 Spring 安全性的简单项目以启用用户名/密码登录。

在 UsernamePasswordAuthenticationFilter 中指向一些断点后,我注意到 getAuthenticationManager 有 0 个提供者

this.getAuthenticationManager()

但是我确实在安全性中添加了这个-context.xml

<authentication-manager>
        <authentication-provider user-service-ref="userDetailsService">
            <password-encoder ref="passwordEncoder"/>
        </authentication-provider>
    </authentication-manager>

看起来 authenticationManager 确实得到了正确的自动装配,但由于某种原因,authentication-provider 没有被注入。

我是不是忘了在某处启用某些东西?

默认情况下,SpringSecurity 使用 org.springframework.security.authentication.ProviderManager,除非设置了父级,否则最初应至少配置一个提供程序。否则你会在初始化阶段得到 IllegalArgumentException。因此,您绝对应该能够在从过滤器返回的身份验证管理器或其父项之一中找到身份验证提供程序(当然,只要没有故意删除提供程序的有害代码)。

我们在从 Spring 安全 3 升级到版本 4 时遇到了这个问题。 我们有一个 AuthenticationManager 定义如下

<authentication-manager alias="authenticationManager">
    <authentication-provider ref="rememberMeAuthenticationProvider"/>
    <authentication-provider ref="customAuthenticationProvider"/>
</authentication-manager>

由于仅使用 alias 属性,因此 Spring 未使用定义的 AuthenticationManager。 我们需要定义一个 id 属性以使其工作。

<authentication-manager id="authenticationManager">
    ...
</authentication-manager>

当没有指定 id 时 Spring 在 org.springframework.security.config.authentication.AuthenticationManagerBeanDefinitionParser.parse 覆盖全局注册的 AuthenticationManager 的 beans 解析期间将 id 设置为“org.springframework.security.authenticationManager”。这似乎弄乱了指定的 providers.