背景:公司内部多个项目 A,B,C,D 等 各项目用户管理没有打通。各个项目单独来维护各自的用户。 项目后端都是 java web,使用 springboot 技术栈,redis,mysql. 前端都是 vue 。
需求:目前计划 A 项目的登录的用户 a,首次跳转到 B 项目时候, 把 A 项目的手机号,名称等带到 B 项目。 前后端尽量少交互的情况下,就是用户感知少的情况下。 直接跳转到 B 项目。把基础的用户信息带过去。免用户的注册操作。
领导安排年后讨论,让每个人出方案。
目前我自己初步的想法: 每次 A 跳转 B 的时候,放一个中间 loading 页。去做用户的初始化工作。 但是感觉这个页面把 AB 两个项目都耦合了。不太优雅。
麻烦做过类似东西的大佬给点意见或者建议。
1
dfzj 2021-02-09 14:25:53 +08:00 1
AB 的关于登录用户的信息肯定不能通过页面传递,否则要对这种传递做后端校验了。
既然绕不开后端,还不如,设置一个统一账户服务,然后 A,B,C,D 各自后台调用该服务来确定当前登录人身份并通过一个统一的 redis session 记录当前用户相关的上下文信息。感觉就是一个单点登录实现的问题。 |
2
dfzj 2021-02-09 14:26:55 +08:00
|
3
huifer 2021-02-09 14:33:40 +08:00 1
做个中央用户系统,把基本数据全部放在中央,对外暴露各类查询接口,现在你将拥有 UserServer 和其他应用,其他应用需要做的事情:接入 UserServer 从他上面进行数据获取,本地用户数据保留,在改动是推送给 UserServer , 关于权限这方面各个系统可以独立保留。
阐述登录操作 1. 先选择任意一个应用登录 2. 登录人现在本地系统查询用户数据,如果存在则进行正常操作,同时需要检查 UserServer 是否存在这个用户,如果不存在则需要像其中添加用户,如果不存在则取 UserServer 获取数据。 UserServer 上线需要先将用户数据从各个应用中收集记录。 内容描述的可能不够详细,有兴趣可以详细了解 |
4
trevis761923 2021-02-09 14:41:45 +08:00
单点登录用 JWT 就行吧
|
5
chengfeng1992 2021-02-09 14:44:24 +08:00 1
如果日后有 ABCD 等项目统一账户的计划,建议按#1 说的,越早做坑越少。
如果没有,只是针对 AB 项目,可以选择: 1. A 项目后台出接口,B 项目后台调用 A 项目的接口判断有无该手机号;如有,拉取用户信息并插入。 2. 直接把 A 项目的全部用户信息导入到 B 项目。 1 、2 各有优缺点 |
6
killergun 2021-02-09 14:46:53 +08:00
你这不是需要一个账号中心
|
7
zoharSoul 2021-02-09 14:50:34 +08:00
a,b,c,d 四个项目后端统一清洗数据, 抽个用户中心出来
|
8
l8g 2021-02-09 14:54:14 +08:00
你主导去做个独立的账号 /用户服务,再引入个 RPC 框架,就能晋升了。
|
9
jorneyr 2021-02-09 15:17:26 +08:00 1
1. 实现了 A 项目的用户带到 B 项目
2. B 项目的用户要不要带到 A 项目呢 |
10
freakxx 2021-02-09 15:26:48 +08:00
直接做 sso,单点登录,jwt 来做,需要的话再用 redis 做个黑名单来做统一用户和 token 管理。
然后再决定要不要做统一页面登录,做个 redirect 参数跳回; 子系统业务再自己处理就好。 |
11
feitxue OP @jorneyr 这个问题好。虽然从目前业务来看,可能性不大,但是也有可能。我得把这个考虑进去。
@huifer 细节不够。思路够了。感谢。 其他大佬就不一一回复感谢了。 @freakxx 也感谢这个思路。 @chengfeng1992 统一账户改动太大,估计总监不会下决心去做。 总之我再梳理下各位的建议,查一下对应的技术栈。 |
12
isSamle 2021-02-09 16:07:37 +08:00
做一个门户工具?门户工具绑定用户所有项目的账号,通过门户直接跳转登录
|
13
sss15 2021-02-10 10:39:07 +08:00 1
A 项目和 B 项目是否存在同一个手机号在两边注册的情况?我觉得要考虑这个情况。目前看来,必须要做统一登陆 sso 。需要考虑的问题主要在 cookie 鉴权上面。细节比较多,很难说清楚,建议多看几篇 sso 的文章。模拟淘宝登陆后,跳转天猫是不用二次登陆的情况。两者的域名是完全不相同的,携带的 cookie 如何传递。
1. 建立 C 项目,只有一个登陆页面,统一身份认证登陆,C 项目可以连接 A 和 B 两个项目的数据库,用户名密码过来后,根据来源自动判断去 A 项目数据库里查还是 B 数据库里查。 2. A 项目中没有登录,需要登陆的时候跳转到 C 项目的登录页面,登陆成功后跳回 A 项目。( A 项目此时将 token 写入 cookie ) 3. 此时从 A 项目跳转到 B 项目,B 项目后台判断尚未登陆,302 跳转到登陆页面(即 C 项目的登录页面),因为之前 C 项目登陆过,所以自动登陆成功再给个 302 跳回 B 项目。( B 项目此时将 token 写入 cookie ) 上面的步骤仅仅是简单地流程,实际要考虑的问题比较多,你们人多,再研究把 |
14
laozhoubuluo 2021-02-11 17:26:33 +08:00 1
楼上说了 SSO 的思路,不过看楼主说领导不愿意上,那就只能想点讨巧的办法解决了。
首先如果不想所有的接口都做 loading 页面,可以考虑每个应用自行维持一个状态(比如请求其他业务的注册状态接口,前后端均可,这个楼主自行考量要不要解耦到这个层级,感觉楼主不愿做),如果不愿做只能是所有需要数据同步的链接上面挂上全量的基础信息(但不包括安全类信息,比如密码或者私钥)。 随后修改所有项目的前端入口点,支持以下流程。 1. 如果一个请求存在基础信息的主键(比如手机号 /身份证号 /集团项目 ID ),就判断当前用户是否是基础信息主键所涉及的 ID,是就走正常业务逻辑,反之就登出当前用户。 2. 请求应用自身的后端接口判断主键是否注册了,如果已经注册就渲染登录页面要求用户登录,登录成功之后走正常业务逻辑即可。 3. 如果没有注册,就渲染一个特殊的注册页面,基础信息自动带入跳转过来的基础信息,只需要用户完成安全类信息的填写(比如密码、私钥、短信验证码)。 4. 用户点击提交发起注册,注册成功之后走正常业务逻辑即可。 |