任何企业,通过多年的累计,总会诞生出各种框架与服务。于是解决各个不同服务的通信以及统一登录便成了刚需。
现状:公司当前系统已经泛滥,最原始的系统已经用了十年,开发公司也已经倒闭,数据库还好,只有mysql和oracle,前端与后台覆盖了n种语言。。
需求:开发单点登录,可以让前端在各个服务下无感的获取数据。并开发app,将所有系统中可以在手机中操作的功能集成(如:审批,定位,考勤等)。
调研与提问:
- 1.经过抓包分析得出结论,原有系统都通过 http 协议传输。
2.用户共同点?单点登录到所有系统,对每个用户必须有通用的识别关系。经过查证工号 唯一 且永不变更。
3.权限问题?每个系统都有自己的权限管理所以不能更改,单点登录系统 单独做自己的权限,只做各个系统入口的权限,内部权限由原系统判断。
解决方案:
- 1.制作单点登录系统,并将企业员工与工号信息做账户表。
- 2.制作 人员系统微服务 实时同步 人事系统人员以及状态 到各个系统中去。
2.当用户登录单点登录系统,将获取唯一token。
3.在单点登录系统中加入 系统绑定模块。为各个系统添加相应路由。比如,a系统 前端访问路由为
127.0.0.1/a/list
b系统 前端访问路由为
127.0.0.1/b/list
4.制作代理服务器,将携带/a/的请求,转发到a系统,如果转发时在redis中,没有找到a系统的cookie/session或者已经过期时。将请求a系统的登录并返回cookie/session,并根据前端携带的token 作为KEY存入到redis中。这里后台需要编写用工号无密码的登录接口,每个系统都得写,并且工号需要做加密处理。
定制规范(前端):
- 1. 新开发 对内系统,统一采用 单点登录账户系统。
- 2. 新购买的 对内系统,必须源码可更改再购买。
- 3. 综合APP内,在各个系统入口处,做权限获取,每当退出子系统入口,将删除该系统权限(因为权限是可变的,不可缓存到本地)。
- 4. 当token 过期时,与后台约定res.code==7000 ,历时退出登录并删除缓存,并请求后台的退出登录接口,防止后期推送错乱问题。
- 5. 凡是APP内的长列表,需要采用官方推荐的长列表API,或者自己写虚拟列表,切记不可为了图方便而自己随便写个分页完事。(uniapp系统最多打开的页面是10页,如果10页都有长达千页分页的长列表,系统会有明显的卡顿与延迟)。
- 6. 凡是有机会用到2次以上的,都封装成组件与方法。
- 7. 所有能抽象出 配置项的 ,配置项统一写在 config.js 中。