Spring Boot下XML配置的Spring Security使用错误认证管理器如何解决
问题原因
- Spring Boot 2.x引入
spring-boot-starter-security后默认会启用SecurityAutoConfiguration安全自动配置,该配置会预先注册全局的AuthenticationManager实例,优先级高于XML中自定义的认证管理器。你看到的启动告警「Overriding globally registered AuthenticationManager」就是这个原因导致的:自动配置先注册了全局认证管理器,XML中定义的id="authenticationManager"的实例后续覆盖了这个自动注册的Bean,但Spring Security的默认逻辑会优先使用全局认证管理器,忽略你在<http>节点上显式指定的authentication-manager-ref配置。 - 你定义的第一个认证管理器只配置了
alias="somethingAuthenticationManager",没有设置id属性,在Spring Boot的ApplicationContext Bean别名解析逻辑中,部分场景下别名无法被<http>节点的引用逻辑正确识别,导致绑定失效。
解决方案
- 禁用Spring Boot的安全相关自动配置,避免自动注册的全局安全组件干扰XML配置,在启动类的
@SpringBootApplication注解中添加排除配置:
@SpringBootApplication(exclude = { org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration.class })
- 修正XML中认证管理器的定义,给
somethingAuthenticationManager加上id属性,避免别名解析异常:
<authentication-manager id="somethingAuthenticationManager"> <authentication-provider user-service-ref="somethingUserDetailsService"> </authentication-provider> </authentication-manager>
- 重启应用验证,此时
<http>节点指定的认证管理器会被正确绑定到对应的接口规则上,不会再默认使用全局的authenticationManager。
内容的提问来源于stack exchange,提问作者Johan
相关产品推荐
相关产品推荐

