天天看点

单点登录 (Single Sign-On, SSO)

一、单点登录的概念与功能

单点登录的英文简称为SSO(single sign on),单点登录功能使得用户只要登录了其中一个系统,就可以访问其他相关系统,而不用进行身份验证登录。即用户只要登陆系统一次,该用户的身份信息就可以被系统中的多个主机上的应用所识别,不需要在访问每个应用时再分别进行登陆。

二、为什么要有单点登录系统

在平常写案例的时候,如果只有一个web工程。如果要访问用户相关信息,那么我们通常会写个拦截器,从session中看能不能取到用户信息,如果不能那么需要返回到登录页面,用户登录后将用户信息保存到session中,那么在此访问用户中心就没问题了。然后这种做法在一个web工程中是没问题的。

2.1 单服务器环境

单点登录 (Single Sign-On, SSO)

传统登录流程

单点登录 (Single Sign-On, SSO)

传统登录流程.png

此方式在只有一个web工程时是没有问题。

2.2 集群环境下

如果系统是分布式的情况呢,比如拿商城来说,它是一个分布式的,什么会员模块,商品管理模块,购物车模块,订单模块等。如果还用上面那张验证方式的话,访问a模块的话发现没登录,然后跳转页面登录了,信息存入session中,如果下次访问的是b模块,由于模块都是存在于不同的服务器session中肯定没有登录用户信息,那么肯定是访问不通过要求重新登录。而且,为了解决高并发还得进行集群,即使是两次访问同一模块,也有可能访问的是集群中的另外一台服务器,这样就存在多次要求登录的问题。
单点登录 (Single Sign-On, SSO)
单点登录 (Single Sign-On, SSO)

分布式登录流程.png

解决:我们可以整个Session服务器(SSO系统)专门用来处理登录问题,这样用户每次访问用户中心的时候都来该服务器判断用户有没有登录,如果登录了放行,没有登录就跳转到登录页面,登录后将用户信息保存到Session服务器中,我们需要用redis来模拟从前的session,以前用户信息存入redis中,这里我们就将用户信息存入redis中。

那么怎么存,用什么做key什么做value呢?在一个web工程的时候,用户信息存入session是这样设置的session.setArrtribute(“admin”,user),获取则是session.getAttribute(“admin”);

很自然的想到用用户id做为key,但是不要这样做,因为这样是不能区分不同的连接的,比如你在A电脑登录了tom这个账号,信息存入redis中了且key为tom的id。然后换个电脑B,但是不直接登录却直接访问用户中心(比如订单结算),那么能不能访问呢?是可以访问的,因为redis中存了这么个键值对啊,然后就能取出来用户信息说明已经登录了,所以肯定给访问。但是这样是不合理的,不应该换电脑登录还能直接访问用户中心。

用一个web工程使用tomcat服务器的时候,tomcat是怎么区分不同连接的呢,实际上每次获取session的时候tomcat会生成一个JSESSIONID的作为标识,然后返回给浏览器存到Cookie里面,下次再访问的时候会带着这个JSESSIONID来访问,然后tomcat拿到这个标识会去寻找对应的session,再从中取出用户信息,这样如果换电脑B了,B浏览器里面是没有这个JSESSIONID的,那么在服务端也找不到对应的session更别说取到用户信息了,所以要求重新登录。

既然是打算用redis来模拟session,那么也可以这样做。用户每次登录的时候都会生成一个唯一的表示token,用它来作为key,用户信息作为value,然后将token存到Cookie里面返给浏览器。用户下次

访问用户中心的时候,从Cookie里面取token,再用token从redis中取用户信息,来判断是否允许访问用户中心。

这样做,只要用户换电脑登录了,那么Cookie里面就没有这个token就查不到用户信息所以必须要重新登录了,分析到这基本上也能做了。

单点登录 (Single Sign-On, SSO)

11.png

继续阅读