问题
sso是什么
答案
sso即Single Sign On,单点登录。我们先说登录,一个系统倘若不记录用户状态,就可以不用登录,那为什么要记录用户状态,我们用一个视频网站举例子。视频网站中包括谁上传了这个视频、谁播放了这个视频、播放了几次、最近这一次看到什么进度等等,这些信息每一个用户都不一样,所以我们要记录每一个用户的信息,这些信息保存在session,每个session都有一个唯一ID。所谓session是指一个用户登录到这个网站直到退出这个网站所经过的时间段,在这个时间段内session的ID不变也唯一,因此就不用重新登录,但当用户重新登录的时候session就会改变,因此我们需要把用户账号密码固化并与权限角色做好映射,从而就能做到无论用户在何时何地登录都能拥有之前存储好的权限。
根据上面的描述,账号密码保证了不同权限,session保证不用反复登录。但有一个问题,session只存在于某个servlet容器,如果我们把服务做成集群,则意味着我们要处理好session共享,而tomcat本身就提供了session共享机制。session共享要消耗时空资源才能完成数据一致化,所以tomcat集群规模不能大。因此,session共享能解决问题,但不是企业级别的解决方案。
企业级别的sso解决方案包括以下几种机制:
- 基于redis和cookie的单点登录机制
- shiro单点登录机制
- cas单点登录解决方案
- springsecurity+jwt单点登录机制
上述单点登录机制都有一个共同特点在于将用户信息统一存储到独立模块,且只由该模块负责认证;同时在用户的请求中务必携带能标记该用户的信息。
这里简述一下第一种方案:
(1)用户输入账号密码验证成功
(2)生成一个唯一id,将该id作为key,将用户信息【密码置空】作为value,存储到redis
(3)将"USER_TOKEN"作为key,将第二步中的id值作为value,写回浏览器端cookie
(4)跳转到另外一个服务的首页,在跳转过程中携带者cookie中的值USERTOKEN:id值
(5)解析USERTOKEN:id值,通过该id值再去请求redis,获取之前存储的用户信息。
网友评论