1. 需求: 系统存在两种类型的用户, 存储在不同的表中, 需要用不同的鉴权逻辑
2. 异常原因:
根本原因是注册了两个UserDetailsService, 当InitializeUserDetailsManagerConfigurer执行configure的时候, 会去spring容器中获取UserDetailsService, 当获取到的实例数量>1时, 返回null, 进而导致AuthenticationManagerBuilder没有将DaoAuthenticationProvider注册进去, 会生成ProviderManager代理类, 然后将这个代理类设置为下一个ProviderManager的parent, 当获取token时, ProviderManager.authenticate使用本类的AuthenticationProvider认证失败后, 会调用parent进行认证, 然而parent是同类型的代理类, 实际上执行的还是当前类, 无限递归, 最终 StackOverflow
感觉这块作者设计的不合理, 获取到多个UserDetailsService的时候应该抛出异常, 不应该返回null