很多人都听说过单点登陆。今天我们来说说什么是单点登陆和无状态登陆。
传统的项目都是使用session来验证登陆,但是在分布式项目中使用session是不行的。因为每个服务都是一个独立的项目,那么我们将服务拆分,肯定会有一个登陆的模块。如果将用户信息保存到session中那么也只有对登陆这个模块有效。而且使用session做登陆的话还有很多缺点,比如服务器要保存每个用户的session这样做的话对服务压力太大,而且session无法做分布式项目
那么接下来就来分析一下什么是单点登陆,
单点登陆也叫有状态登陆,对应的无状态登陆在下面也会分析。
看上图我们知道,我们专门弄了一台单点服务器,用户登陆成功后会将该用户的信息保存到单点服务器中,然后单点服务器给用户返回一个Token,用户每次请求时都会带上Token,与之对应的服务将拿到用户携带的Token,然后去单点服务器上验证该Token是否有效,如果有效的话单点服务器会返回当前用户的信息。这个就是传统的单点登陆,也就有状态登陆
有状态登陆的不足:
- 单点服务器压力比较大,因为既要保存用户信息然后验证Token是否有效,
- 过程过于繁琐,每次请求都会去单点服务器验证
无状态登陆:如果说有状态登陆就是要保存用户的信息的话,那么无状态登陆就是不需要保存用户的信息了。
无状态登陆有两种,一种是采用对等盐,一种是采用非对等盐(非对称加密)
采用对等盐的话,每次我们都要去授权中心验证Token是否有效,而采用不对等盐的话服务自己就能验证了。
对等盐应该看上图就能够明白,这里来说说不对等盐,
采用RSA256加密来生成公钥私钥,并且在授权中心采用私钥来生成Token
- 采用私钥生成的Token,私钥公钥都能解
- 采用公钥生成的Token,只有私钥能解
那么其他每个服务都持有公钥,而授权中心只需要用私钥加密即可,这样每个服务就能自己解析Token,而无需去授权中心
这里再说一下,如果你觉得每个服务上都要解析Token太麻烦了,那么你是对的,一般我们都会采用网关,在用户经过网关的时候就会验证该Token是否有效,如果失效了网关就会拦截