SSO单点登录统一身份认证系统
什么是单点登录
简单点说就是公司有A,B两个系统,我登录了A系统之后再跳转到B系统可以直接访问,而不需要再次登录B系统.
几种常见的单点登录实现方式
在讲解单点登录之前先讲解几个基本的概念:
Cookie:
Cookie是一段不超过4KB的小型文本数据,是保存在用户本地的,常见格式为:
Expires属性:设置Cookie的生存期
Domain属性:指定了可以访问该 Cookie 的 Web 站点或域
比如图中的Domain:192.168.1.72这就表示只能只有1.72下的请求可以使用这个cookie,百度什么的就不能使用这个cookie
Path属性:定义了Web站点上可以访问该Cookie的目录
图中的Path是/,这表示这个cookie是根目录拥有的,只要1.72的请求都会默认带上这个cookie,加入Path是/webaikn,那么只有http://192.168.1.72/webaikn/**的请求会带上这个cookie,而http://192.168.1.72/webadmin/**就无法使用这个cookie
其他:略
Session:
http请求是无状态的,但是我们日常访问系统的时候都是希望系统能记住我这个用户,这时候就要靠session去实现,因此session成为会话控制.但是光靠session还是无法实现会话控制的,还需要cookie的配置,如图所示:
这个JESSIONID就是保持会话的关键,它的value对应的就是该用户在服务器的sessionId,所以我们代码直接写HttpSession session = request.getSession(); 才不会数据错乱.
Ps:session的存在方便了我们的开发,但是也在一定程度上增加了麻烦,比如多机部署时候的seesion丢失,
重定向
一句话,转发是服务器行为,重定向是客户端行为.
转发和重定向都可以由java后台实现,例如:
请求转发:
request.getRequestDispatcher("/user").forward(request,response);
重定向:
response.sendRedirect(request.getContextPath + "/user")
当设置转发之后,请求会直接去转发的地址,而重定向的话请求会先返回客户端,然后再由客户端重新发起请求去新的地址.这里就隐藏了一个知识点,当我在后台设置了cookie然后重定向的时候,其实我重定向的请求中已经带上了我设置的cookie
(1) 假设A和B两个系统都部署在192.168.110.110服务器上
用户在登录了A系统之后,后台代码设置将userName和password作为cookie存入到用户的浏览器中并将cookie的domain设置为192.168.110.110,path设置为/
之后访问B系统的时候由于大家的Ip都是一样的,所以B系统能够获取到A系统设置的cookie,这是只需要设置一个拦截器,在拦截器中判断用户是否是登录状态,如果未登录就去request中获取cookie信息,获取到之后解密然后模拟登录,这样用户可以无感知的登录到B系统.
点评:这是典型的同域单点登录实现方式,局限性非常大,必须要两个系统在同一个服务器或者二级域名相同的情况下才能实现,一般称为伪单点登录
(2) 知识库系统的单点登录实现
知识库的方案1的基础上增加了Nginx作为反向代理(有反向代理就有正向代理,自行查找资料什么是正向代理什么是反向代理)
虽然webaikn和webadmin部署在不同的服务器,但是对客户是无感知的,由于都是访问Nginx,然后再由nginx做转发代理,所以域名是同一个,这样cookie也是可以共享的,这里有一个点需要注意一下,webaikn可能是多机部署,所以nginx在做转发的时候需要设置ip_hash策略,目的就是保证用户上一次请求访问的哪台服务器,下一次还是访问那一台服务器,不至于导致session丢失的情况.
点评:解决了多机部署单点登录失效的情况,但是还是需要服务器端保存用户的session状态,一方面对于服务器端会产生内存压力,另一方面需要配置ip_hash导致流量不均衡,某些服务器压力比较大的情况.而且用户名和密码保存在cookie中也存在一定的安全隐患,只要被截取到一次请求都会造成账户被盗的情况
(3) 跨域token实现单点登录
主要步骤:
- 用户登录A系统,A系统拦截器发现请求没有带token,于是重定向到单点登录认证中心sso系统,注意带上用户之前请求的url,我们后面就叫oldUrl
- Sso接收到请求,发现request的cookie中没有登录成功的令牌token,于是重定向到本系统的登录页面,继续带着oldUrl
- 用户输入用户名和密码,提交
- Sso验证用户名是否正确,不正确继续重定向到登录页面,如果正确,进行下面的操作:
生成一个cookie,name就叫token,value可以是任意不重复的值,uuid就行(注意这个cookie是浏览器和sso系统之间的)
将用户信息保存到redis中,key是生成的uuid,value就是user对象
重定向到oldUrl的地址,注意要拼接上token参数
- A系统再次收到请求,不同的是这次有token参数,A系统根据token的值去redis验证,这里需要分情况讨论了
没有找到:说明其他子系统发起了注销操作,需要重定向到sso登录页面
找到了:有了User对象之后可以判断当前请求是否在用户权限表中,存在就直接放行,不存在返回权限不足,之后的请求都需要将token放到请求头信息或者url中
- 用户浏览完A系统之后,准备去B系统转转,于是浏览器向B系统发起请求,B系统拦截器收到请求,发现请求没有带token,发起重定向去sso,记得带上本次请求的oldUrl
- 这时候其实和上面的第二步差不多,区别在于由于之前登录过sso所以这次的request中是有token的cookie的,所以sso只需要重定向到oldUrl指向的地址就行,同时记得将cookie中取出来的token拼接到url中
- B再次系统收到请求,之后的操作和步骤5是一样的了
点评:独立出单点登录认证中心,统一做权限认证操作,清晰明了
子系统不需要用session保存用户登录状态,减轻了服务器的负担
每次请求都是以token作为验证标准,就算请求被拦截了,用户的信息也不会泄露
后期做三方登录的时候也不需要将用户数据暴露给其他系统,其他系统能获取的只有token(真要做三方登录redis中存放的肯定是最简单的一些用户信息)
下面这个图取自哪位大佬我已经没有地址了,好像是百宝门
来源:https://www.cnblogs.com/renchunpeng/p/11753921.html
SSO单点登录统一身份认证系统的更多相关文章
- 基于DDD + SD.Framework实现的统一身份认证系统
项目地址 http://git.oschina.net/lishilei0523/ShSoft.UAC 项目说明 本项目开发的目的有三: 1.作为一个使用SD.Framework框架开发的项目样板 2 ...
- 中国科学技术大学统一身份认证系统CAS
CAS | Apereohttps://www.apereo.org/projects/cas 中国科学技术大学统一身份认证系统https://passport.ustc.edu.cn/login?s ...
- 构建基于分布式SOA架构的统一身份认证体系
摘要:本文充分利用SOA架构松耦合的特点,通过规范统一网络接口实现业务系统整合,既提升系统安全性,又简化资源访问操作,具有重要的理论和现实意义. 统一身份认证旨在将分散在各个信息系统中的用户和权限资源 ...
- JEECG 集成KiSSO单点登录实现统一身份认证
JEECG 集成KiSSO单点登录实现统一身份认证 JEECG 如何为其他第三方系统实现统一身份认证服务,实现单点登录? 第三方系统如何对接呢? 今天为大家揭开这层面纱,让大家了解实质,使用它更快速的 ...
- 多系统实现单点登录方案:SSO 单点登录
一.什么是单点登录SSO(Single Sign-On) SSO是一种统一认证和授权机制,指访问同一服务器不同应用中的受保护资源的同一用户,只需要登录一次,即通过一个应用中的安全验证后,再访问其他应用 ...
- NET Core 2.0使用Cookie认证实现SSO单点登录
NET Core 2.0使用Cookie认证实现SSO单点登录 之前写了一个使用ASP.NET MVC实现SSO登录的Demo,https://github.com/bidianqing/SSO.Sa ...
- sso单点登录系统
sso单点登录概念 1.一处登录,处处登录.会单独做一个单点登录系统,只负责颁发token和验证token,和页面登录功能. 2.通过在浏览器cookie中放入token,和在redis中对应toke ...
- IdentityServer4实现单点登录统一认证
什么是单点登录统一认证:假如某公司旗下有10个网站(比如各种管理网站:人事系统啊,财务系统啊,业绩系统啊等),我是该公司一管理员或者用户,按照传统网站模式是这样:我打开A网站 输入账号密码 然后进入到 ...
- sso单点登录系统(解决session共享)
场景:假设一个用户将自己的登录信息提交到后台,如果session保存的信息分布在多台机器上,并且不共享,那么可能导致用户的登录信息出现短暂的丢失,为什么这样讲,因为用户访问服务器中间还要经过负载均衡服 ...
随机推荐
- 第七章 路由 76 路由传参-使用params方式传递路由参数
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...
- TCP_Wrappers访问控制
一.TCP_Wrappers简介 对有状态连接的特定服务进行安全检测并实现访问控制,它以库文件形式实现,某进程是否接受libwrap的控制取决于发起此进程的程序在编译时是否针对libwrap进行编译的 ...
- python面向对象基础(三)内置方法 __xx__
__str__和__repr__,__format__ 改变对象的字符串显示__str__,__repr__ 自定制格式化字符串__format__ #_*_coding:utf-8_*_ forma ...
- 常见的SQL编写和优化
目录 常见SQL编写和优化 常见的SQL优化方式 常见SQL编写和优化 常见的SQL优化方式 对查询进行优化,应尽量避免全表扫描,首先应考虑在where及order by 涉及的列上建立索引. 应尽量 ...
- 【51nod 1667】概率好题
题目 甲乙进行比赛. 他们各有k1,k2个集合[Li,Ri] 每次随机从他们拥有的每个集合中都取出一个数 S1=sigma甲取出的数,S2同理 若S1>S2甲胜 若S1=S2平局 否则乙胜 分别 ...
- vue学习时遇到的问题(二)
1. this.$nextTick veu中进行数据改变后,并不会马上刷新视图:用nextTick可告诉执行下个函数后马上刷新视图: this.$nextTick(function(){ // ...
- js上传超大文件解决方案
需求: 支持大文件批量上传(20G)和下载,同时需要保证上传期间用户电脑不出现卡死等体验: 内网百兆网络上传速度为12MB/S 服务器内存占用低 支持文件夹上传,文件夹中的文件数量达到1万个以上,且包 ...
- LA 4223 最短路 路径选择要求提高一点
F - Trucking Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit Statu ...
- SDOI2015 寻宝游戏 | noi.ac#460 tree
题目链接:戳我 可以知道,我们相当于是把有宝藏在的地方围了一个圈,求这个圈最小是多大. 显然按照dfs序来遍历是最小的. 那么我们就先来一遍dfs序列,并且预处理出来每个点到根的距离(这样我们就可用\ ...
- AcWing:109. 天才ACM(倍增 + 归并排序)
给定一个整数 MM,对于任意一个整数集合 SS,定义“校验值”如下: 从集合 SS 中取出 MM 对数(即 2∗M2∗M 个数,不能重复使用集合中的数,如果 SS 中的整数不够 MM 对,则取到不能取 ...