前言:
最近的工作与学习中接触到需要开发一个单点登录的功能模块,在搜集网上的一些不错的文章写的一份简易的总结,简述了单点登录的实现思路和原理,最后我也提供了一个写的非常简易的单点登录的springboot项目,仅用作学习分享。
目录
一、什么是单点登录(SSO)
二、单点登录的原理
三、单点登录的实现方案
(一)、通过Cookie+Session实现单点登录
(二)、通过Session共享实现单点登录
(三)、通过Token实现单点登录
四、gitee项目简介
(一)、源码地址
(二)、项目简介
(三)、项目整体结构
(四)、操作过程
单点登录的英文名全称叫做:Single Sign On,简称SSO,是指在同一个账号平台下的多个子系统中,用户只需要登录一次,就可以访问其余所有相互的信任的系统,比如支付宝旗下有天猫和淘宝,当我登陆了淘宝以后,天猫也会同步进行登录,就不需要们再一个个去进行登录操作了,简而言之便是,多个互相信任的子系统同步登陆。
SSO有单独的一个认证中心,所有的子系统都是通过这个认证中心的登录入口进行登录的,登录的时候会附带自己的URL,首先SSO认证中心会验证客户的账号和密码是否正确,之后会创建全局绘画以及Token,Token会发放给每个子系统,当子系统拿到了Token,便有了授权,就可以创建客户与该子系统的局部会话。
这里我主要归纳了三种方案进行了大概的简述。
使用Cookie作为存放客户的凭据,当客户登录成功后,SSO会返回一个加密的Cookie,当用户访问子系统时候会携带上这个Cookie进行访问受保护的资源,当客户在访问子系统时候,先拿到对于子系统的Cookie,再从Redis中查询Cookie是否存在,不存在则重定向到登录页面,存在则正常执行程序,实现单点登录。
Redis是一个键值对(Key,Value)存放客户信息,Key:ID,Value:用户数据,例如姓名,密码和身份证等等
Cookie:把Redis生成的Key存入Cookie当中
步骤概述:
1、客户访问系统1中受保护的资源,系统1发现客户还未登录,跳转到SSO认证中心,并将自己的地址作为参数
2、SSO认证中心发现客户还没登录,将客户引导至登录界面
3、客户输入账号和密码申请登录
4、SSO认证中心校验用户信息,比对通过则与客户创建与SSO认证中心之间的会话,称之为全局会话,同时创建授权令牌。
5、SSO认证中心带着令牌跳转回系统1的请求地址
6、系统1拿到令牌,去SSO认证中心校验令牌是否有效
7、SSO认证中心校验令牌,结果有效,则注册系统1
8、系统1使用该令牌和客户创建局部绘画,返回受保护的资源
注意如下6点:
1、客户与SSO认证中心建立的会话称为全局会话
2、客户与子系统创建的会话称为局部会话
3、局部会话存在,则全局会话一定存在
4、全局会话存在,则局部会话不一定存在
5、全局会话销毁,则局部会话一定销毁
6、相同的域的Cookie可以进行共享,例如ww.abc.com和www.efd.com可以访问xxx.com的Cookie,但ww.abc.com和www.efd.com是不能互相访问的
1、客户第一次登录成功时候,将会话信息(用户ID和数据)写入共享Session
2、客户再次登录时,获取共享Session,判断是否有会话信息,如果没用则跳转到登录页面
3、存入会话,设置会话持久时间,超过固定时间后自动超时
1、在通过SSO认证后,按照指定规则生成字符串,把登录之后的用户信息加密到字符串当中,把此字符串进行返回,可以把字符串通过Cookie返回也可以拼接在URL地址上进行返回
2、再次访问其他子系统,在地址栏附带生成的加密字符串,子系统获取加密的字符串,根据加密的字符串获取用户信息,如果没问题就可以访问受保护资源
https://gitee.com/huang-tuantuan/sso
这里我主要通过Token拼接在URL上面实现的单点登录,整体项目写的非常简易,仅用于提供一个学习思路,对单点登录有个基础的了解。
index模块:首页
ekp模块:ekp子系统
oa:oa子系统
login模块:sso登录认证
2、点击立即登录,输入账号和密码,点击登录
3、 登录成功后会重定向到首页,token拼接在了URL地址上
4、尝试访问oa子系统和访问ekp子系统,发现已经自动登录
5、再次回到首页,点击退出登录后
6、再次尝试访问oa子系统和ekp子系统 ,发现都已经自动退出登录
以上就是我对单点登录的一些理解与总结!