请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

SocialAuthenticationProvider中usersConnectionRepository问题

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

https://img1.sycdn.imooc.com//szimg/5a0c692100011cb011440222.jpg

https://img1.sycdn.imooc.com//szimg/5a0c69210001349617000968.jpg


正在回答 回答被采纳积分+3

4回答

poxige 2018-01-25 17:08:15

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

我们的两个类: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 回复 有任何疑惑可以回复我~
  • 厉害,多谢了
    回复 有任何疑惑可以回复我~ 2019-07-03 20:08:27
  • 我也跟了半天,就是没有跟到QQAutoConfig中去。。。感谢!
    回复 有任何疑惑可以回复我~ 2019-12-06 18:55:19
提问者 小猪佩佩佩 2017-11-17 23:30:36

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

2 回复 有任何疑惑可以回复我~
  • 朋友,我也遇到了跟你一样的问题,但是我把SocialConfig移到main/src或security.core包下,还是没用,依然实例化的InMemoryUsersConnectionRepository。能指一二嘛?我都熬了好几晚啦
    回复 有任何疑惑可以回复我~ 2017-12-23 04:03:46
  • 提问者 小猪佩佩佩 回复 KevinCoder #2
    应该是加载顺序的问题,导致默认加载了内存方式,没有加载成JDBC的方式,你可以尝试配置到和security配置同级的目录看看
    回复 有任何疑惑可以回复我~ 2017-12-25 11:03:48
春生啊 2018-08-30 18:08:24

@Order(1)
public class SocialConfig extends SocialConfigurerAdapter {

// ... ...

}

0 回复 有任何疑惑可以回复我~
KobeLi 2017-12-29 19:55:23

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

0 回复 有任何疑惑可以回复我~
  • @Order(1)
    public class SocialConfig extends SocialConfigurerAdapter {}
    加上@Order注解 ,我的问题解决了。
    【@Order标记定义了组件的加载顺序。】
    回复 有任何疑惑可以回复我~ 2018-01-01 23:07:08
  • 居然自动换行了,笑哭~,给SocialConfig 类加上@Order(1) 注解就行了
    回复 有任何疑惑可以回复我~ 2018-01-01 23:08:40
  • 邪血殇 回复 XquanZeng #3
    感谢,解决了我的问题
    回复 有任何疑惑可以回复我~ 2018-01-09 11:23:43
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信