请稍等 ...
×

采纳答案成功!

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

oath2 登录,我先知道怎么获取当前的ClientId

老师,您好:
是这样,我现有公司的系统需要改造,这个系统涉及到3个不同角色的端,每个端都有自己的用户数据库,由于历史原因,各自端的用户登录都是走的各自系统。由于业务发展,现在的模式已经限制了业务发展,最近想把登录系统统一化,但是是一步步实施的,各自系统的用户库保持不变,使用spring security oauth登录来实现统一用户登录和授权。然后现在我面临一个问题就是怎么在调用 UserDetailsService.loadUserByUsername 方法的时候知道这个用户来自哪个ClientId,根据此我好去不同的数据库读取用户信息。我调试了一下发现UserDetailsService.loadUserByUsername 是在 ClientDetailsService.loadClientByClientId 前面执行的。【不过我发现session中保存了sessionAttr:SPRING_SECURITY_SAVED_REQUEST,但是我调试的时候并不能获取到,在session中也没有此key。很奇怪,我是把sesion存储到redis里而看到此key的。】

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

1回答

接灰的电子产品 2021-07-21 11:04:58

oauth 的标准流程是先进行用户鉴权,然后才是oauth 授权,你的情况应该考虑在用户登录阶段区分

0 回复 有任何疑惑可以回复我~
  • 提问者 慕斯卡2532047 #1
    老师,我右仔细研究了下,得出的结论,请您指教:
    oauth/authorize?**** 地址是客户端跳转地址,在此地址上spring security会检查用户是否登录,session是否存在,如果已经登录直接呈现授权画面(还是oauth/authorize?*** 这个地址)。如果没有登录会跳转至登录页面,这个时候有个重要的扩展点,在跳转至登录页面前spring security会将来源地址也就是oauth/authorize?**** 地址缓存起来(默认使用session保存)。登录成功后如果从缓存中发现有targetUrl会再跳转至targetUrl
      (也就是授权oauth/authorize?*** 地址。)在DaoAuthenticationProvider对AuthenticationToken进行认证的时候我可以获取到这个targetUrl, 我就知道了这个登录来自哪个ClientId。如果你的项目初期用户体系是分散的有多个不同作用的用户数据库要整合,那根据targetUrl就可以去哪个库查询用户了。  同时也知道了oauth2登录先调用普通用户进行认证再对Client进行认证。具体获取的代码我参考源码的:
    
    //获取保存的targetUrl。更具此url来判断登录来自哪个Client。
            HttpSessionRequestCache httpSessionRequestCache = new HttpSessionRequestCache();
            SavedRequest savedRequest = httpSessionRequestCache.getRequest(ApplicationContextHolder.getHttpServletRequest(), null);
    回复 有任何疑惑可以回复我~ 2021-07-21 11:34:57
  • 可以的,在url上做点文章没有问题
    回复 有任何疑惑可以回复我~ 2021-07-25 22:41:50
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信