SocialAuthenticationProvider中usersConnectionRepository问题
来源:5-6 处理注册逻辑

小猪佩佩佩
2017-11-16
QQ登陆后断点到SocialAuthenticationProvider的toUserId方法,发现usersConnectionRepository实例化是InMemoryUsersConnectionRepository,但是配置的是JdbcUsersConnectionRepository
4回答
-
poxige
2018-01-25
感谢帮助,我顺便跟着再分析了一遍。
我们的两个类:SocialConfig、QQAutoConfig 都继承了 SocialConfigurerAdapter:
QQAutoConfig --> SocialAutoConfigurerAdapter --> SocialConfigurerAdapter(此处返回InMemoryUsersConnectionRepository) --> SocialConfigurer
SocialConfig --> SocialConfigurerAdapter -> SocialConfigurer,因为重写返回的是:JdbcUsersConnectionRepository
SocialConfig 的注解 @EnableSocial 会Import(SocialConfiguration.class),
SocialConfiguration 中:
@Autowired public void setSocialConfigurers(List<SocialConfigurer> socialConfigurers)
Spring会自动把 SocialConfigure 的实现类,注入到List中来,这个顺序将影响我们取得的usersConnectionRepositor,如下。
org.springframework.social.config.annotation.SocialConfiguration#usersConnectionRepositor
中遍历“socialConfigurers”取“ucrCandidate”,断点可以看到List中的第一个是 “QQAutoConfig”(继承了SocialAutoConfigurerAdapter),故其调用
org.springframework.social.config.annotation.SocialConfigurerAdapter#getUsersConnectionRepository
返回`InMemoryUsersConnectionRepository`;
分析后,我觉得可以有两种办法:
QQAutoConfig 重写 getUsersConnectionRepository 方法,返回 null, 这样在 “ucrCandidate”会有null判断,进而会取 SocialConfig 中的JdbcUsersConnectionRepository
如题主说是,在SocialConfig 定义@Order (1),或者QQAutoConfig 也指定@Order,让后者数字大于前者
522019-12-06 -
小猪佩佩佩
提问者
2017-11-17
没人回答!那就自己回答下怎么解决的吧,经过两天排查和质料查阅,都没发现配置代码逻辑问题,最后在万般无奈的情境下,把SocialConfig移到了项目的根路径,重启后发现好了,对,好。。。。好。。。。了,就是这么神奇,感觉这个应该是和编译顺序有关系,具体等有时间在排查下
222017-12-25 -
春生啊
2018-08-30
@Order(1)
public class SocialConfig extends SocialConfigurerAdapter {// ... ...
}
00 -
KobeLi
2017-12-29
我也遇到相同的问题,熬了几夜了,还没有解决,老师能帮忙看下吗?
032018-01-09
Spring Security技术栈开发企业级认证与授权
2662 学习 · 1561 问题
相似问题