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

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 一、单点登录的概念与功能单点登录的英文简称为SSO(single sign on),单点登录功能使得用户只要登录了其中一个系统,就可以访问其他相关系统,而不用进行身份验证登录。

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

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

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

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

2.1 单服务器环境

img_df4cca49b62e2bbf0de383441a969f7a.png
传统登录流程
img_14dd5176f0343e35afab4648acebcd10.png
传统登录流程.png

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

2.2 集群环境下

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


img_3383d5b92b809eb01e3eb414b3effb0b.png
img_031b35184efe7acf4dfb710519f0e6b5.png
分布式登录流程.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就查不到用户信息所以必须要重新登录了,分析到这基本上也能做了。


img_fb3feaaa57fceaa1d404a664b2ef62fb.png
11.png
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
钉钉免登(Single Sign-On, SSO)
钉钉免登(Single Sign-On, SSO)
586 0
|
3月前
【Azure APIM】在APIM中实现JWT验证不通过时跳转到Azure登录页面
【Azure APIM】在APIM中实现JWT验证不通过时跳转到Azure登录页面
|
3月前
|
API
【Azure Developer】记录一段验证AAD JWT Token时需要设置代理获取openid-configuration内容
【Azure Developer】记录一段验证AAD JWT Token时需要设置代理获取openid-configuration内容
|
3月前
|
JSON 算法 API
【Azure API 管理】APIM 配置Validate-JWT策略,验证RS256非对称(公钥/私钥)加密的Token
【Azure API 管理】APIM 配置Validate-JWT策略,验证RS256非对称(公钥/私钥)加密的Token
|
3月前
|
Java API 开发工具
【Azure Developer】使用 Microsoft Authentication Libraries (MSAL) 如何来获取Token呢 (通过用户名和密码方式获取Access Token)
【Azure Developer】使用 Microsoft Authentication Libraries (MSAL) 如何来获取Token呢 (通过用户名和密码方式获取Access Token)
|
5月前
|
安全 Java 数据安全/隐私保护
在Spring Cloud中实现单点登录(Single Sign-On, SSO)
在Spring Cloud中实现单点登录(Single Sign-On, SSO)
312 2
Basic Auth认证
Basic Auth认证
174 1
|
存储 前端开发 NoSQL
有关token实现单点登录步骤
有关token实现单点登录步骤
773 0
|
缓存 NoSQL Java
SSO (Single Sign On)
在大型的互联网公司中会有多个系统, 多个项目, 虽然这些项目都属于同一家公司, 但是项目本身其实都是独立的, 那多个系统可不可以实现共享同一份用户认证数据呢?
155 0