我尝试使用Spring安全设置一个简单项目来启用Username / pwd登录。
在UsernamePasswordAuthenticationFilter中指出一些断点后,我注意到getAuthenticationManager有0个提供者
this.getAuthenticationManager()
但是我确实在security-context.xml中添加了它
<authentication-manager>
<authentication-provider user-service-ref="userDetailsService">
<password-encoder ref="passwordEncoder"/>
</authentication-provider>
</authentication-manager>
看起来authenticationManager确实正确地自动连接,但由于某种原因,不会注入身份验证提供程序。
我忘了在某个地方启用某些东西吗?
答案 0 :(得分:1)
默认情况下,SpringSecurity使用org.springframework.security.authentication.ProviderManager
,除非设置了父级,否则最初应该至少有一个已配置的提供程序。否则,您将在初始化阶段获得IllegalArgumentException
。因此,您肯定应该能够在从过滤器返回的身份验证管理器中或在其父节点中找到身份验证提供程序(只要当然没有有意删除提供程序的有害代码)。
答案 1 :(得分:0)
从Spring Security 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的情况下,在org.springframework.security.config.authentication.AuthenticationManagerBeanDefinitionParser.parse
中的bean解析期间,Spring会将ID设置为“ org.springframework.security.authenticationManager”,以覆盖全局注册的AuthenticationManager
。这似乎以某种方式弄乱了指定的providers
。