SocialAuthenticationProvider中usersConnectionRepository问题

来源:5-6 处理注册逻辑

小猪佩佩佩

2017-11-16

QQ登陆后断点到SocialAuthenticationProvider的toUserId方法,发现usersConnectionRepository实例化是InMemoryUsersConnectionRepository,但是配置的是JdbcUsersConnectionRepository

http://img.mukewang.com/szimg/5a0c692100011cb011440222.jpg

http://img.mukewang.com/szimg/5a0c69210001349617000968.jpg


写回答

4回答

poxige

2018-01-25

感谢帮助,我顺便跟着再分析了一遍。

我们的两个类:SocialConfig、QQAutoConfig  都继承了 SocialConfigurerAdapter:

  1. QQAutoConfig --> SocialAutoConfigurerAdapter --> SocialConfigurerAdapter(此处返回InMemoryUsersConnectionRepository) --> SocialConfigurer

  2. 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`;

分析后,我觉得可以有两种办法:

  1.  QQAutoConfig  重写 getUsersConnectionRepository 方法,返回 null, 这样在 “ucrCandidate”会有null判断,进而会取 SocialConfig 中的JdbcUsersConnectionRepository

  2. 如题主说是,在SocialConfig 定义@Order (1),或者QQAutoConfig 也指定@Order,让后者数字大于前者


5
2
小白一只726
我也跟了半天,就是没有跟到QQAutoConfig中去。。。感谢!
2019-12-06
共2条回复

小猪佩佩佩

提问者

2017-11-17

没人回答!那就自己回答下怎么解决的吧,经过两天排查和质料查阅,都没发现配置代码逻辑问题,最后在万般无奈的情境下,把SocialConfig移到了项目的根路径,重启后发现好了,对,好。。。。好。。。。了,就是这么神奇,感觉这个应该是和编译顺序有关系,具体等有时间在排查下

2
2
小猪佩佩佩
回复
KevinCoder
应该是加载顺序的问题,导致默认加载了内存方式,没有加载成JDBC的方式,你可以尝试配置到和security配置同级的目录看看
2017-12-25
共2条回复

春生啊

2018-08-30

@Order(1)
public class SocialConfig extends SocialConfigurerAdapter {

// ... ...

}

0
0

KobeLi

2017-12-29

我也遇到相同的问题,熬了几夜了,还没有解决,老师能帮忙看下吗?

0
3
邪血殇
回复
XquanZeng
感谢,解决了我的问题
2018-01-09
共3条回复

Spring Security技术栈开发企业级认证与授权

Spring Security技术栈,REST风格开发常见接口,独立开发认证授权模块保证REST服务安全

2662 学习 · 1561 问题

查看课程