一.分析普通登录和单点登录的区别
在微服务架构下,用户的登录与单机登录是有很大区别的.
使用Session
单机登录:
用户输入用户名和密码,我们到数据库中查找与用户名对应的数据,然后将用户数据保存在Session中,返回一个Session id给客户端,客户端下次访问的时候携带着这个Session id,服务器端就可以查看保存在服务器的Session信息中是否有这个id,有这个id表示当前用户是登录状态的.
微服务登录:
在微服务中,因为我们的项目分成了很多的模块,每个模块都部署在一个独立的服务器上,用户登录的时候,通过网关的检查,然后到达用户登录模块,用户信息Session就保存在当前用户模块.但是由于不同的模块部署的服务器不同,当前模块的服务器并不会和其他服务器共享这个Session,所以在访问其他模块的时候,通过Session并不能获得用户模块中登录的信息,因此在处理其他业务的时候就丢失了用户信息,导致无法处理业务.
二.如何解决
1.Session共享
这种方法的核心思想就是将用户登录信息共享给其他模块,使用与小型项目,用户量一旦激增,就会造成大量的数据冗余,导致内存数据冗余.这种方法依托Redis等缓存作为媒介,将信息存入Redis中,其他模块再从Redis中读取用户信息.
2.JWT令牌(Json Web Token)
这种方式的最大优点就是不占用内存,也是目前主流的一种形式
其过程大致是:
1.通过SSO登录服务器来验证用户登录,如果验证成功,将用户数据保存在一个生成的JWT令牌中,不保存在Session,响应给前端
2.前端接到登录成功的响应后,将该JWT令牌保存在Cookie或localStorage中
3.下次访问服务器的时候,将这个JWT令牌放入请求头中,发往服务器
4.服务器过滤器中解析请求头
5.其他模块在处理业务之前都会经过过滤器,在过滤器中解析了请求头中的JWT,成功解析就能获得用户信息
6.在需要验证信息/表明身份的时候,将该JWT数据放入请求头中就发送请求即可
即使各个服务器不是部署在同一个容器中,只要各服务器中都有过滤器来解析用户的JWT令牌,就能获得用户的信息.