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实现单点登录

主要步骤:

  1. 用户登录A系统,A系统拦截器发现请求没有带token,于是重定向到单点登录认证中心sso系统,注意带上用户之前请求的url,我们后面就叫oldUrl
  2. Sso接收到请求,发现request的cookie中没有登录成功的令牌token,于是重定向到本系统的登录页面,继续带着oldUrl
  3. 用户输入用户名和密码,提交
  4. Sso验证用户名是否正确,不正确继续重定向到登录页面,如果正确,进行下面的操作:

生成一个cookie,name就叫token,value可以是任意不重复的值,uuid就行(注意这个cookie是浏览器和sso系统之间的)

将用户信息保存到redis中,key是生成的uuid,value就是user对象

重定向到oldUrl的地址,注意要拼接上token参数

  1. A系统再次收到请求,不同的是这次有token参数,A系统根据token的值去redis验证,这里需要分情况讨论了

没有找到:说明其他子系统发起了注销操作,需要重定向到sso登录页面

找到了:有了User对象之后可以判断当前请求是否在用户权限表中,存在就直接放行,不存在返回权限不足,之后的请求都需要将token放到请求头信息或者url中

  1. 用户浏览完A系统之后,准备去B系统转转,于是浏览器向B系统发起请求,B系统拦截器收到请求,发现请求没有带token,发起重定向去sso,记得带上本次请求的oldUrl
  2. 这时候其实和上面的第二步差不多,区别在于由于之前登录过sso所以这次的request中是有token的cookie的,所以sso只需要重定向到oldUrl指向的地址就行,同时记得将cookie中取出来的token拼接到url中
  3. B再次系统收到请求,之后的操作和步骤5是一样的了

点评:独立出单点登录认证中心,统一做权限认证操作,清晰明了

子系统不需要用session保存用户登录状态,减轻了服务器的负担

每次请求都是以token作为验证标准,就算请求被拦截了,用户的信息也不会泄露

后期做三方登录的时候也不需要将用户数据暴露给其他系统,其他系统能获取的只有token(真要做三方登录redis中存放的肯定是最简单的一些用户信息)

下面这个图取自哪位大佬我已经没有地址了,好像是百宝门

来源:https://www.cnblogs.com/renchunpeng/p/11753921.html

原文地址:https://www.cnblogs.com/zhupengfei/p/11755239.html

时间: 2024-07-30 20:28:59

SSO单点登录统一身份认证系统的相关文章

java统一身份认证系统

每天记录学习,每天会有好心情.*^_^* 最近了解了基于java的统一身份认证系统项目,在这个平台记录一下这个基于java的统一身份认证系统项目,方便以后再次使用或学习的时候能够及时的翻阅.在完成基于java的统一身份认证系统项目的时候,考虑了很多框架.最终决定选用SSM(MYECLIPSE),该框架具有极强的移植性,多平台性,便于操作性等优点.此框架能在MYECLIPSE开发工具中完美的编写和运行,基于java的统一身份认证系统为一个 后台项目.本文主要针对媒体传播类网站中数据的安全级别采用动

基于DDD + SD.Framework实现的统一身份认证系统

项目地址 http://git.oschina.net/lishilei0523/ShSoft.UAC 项目说明 本项目开发的目的有三: 1.作为一个使用SD.Framework框架开发的项目样板 2.探索基于ASP.NET MVC的前端架构 3.做一套统一身份认证系统 注意事项: 如果编译失败,请安装PostSharp-4.1.15.exe(项目根目录下或附件中有) 请先修改服务端AppService项目配置文件中连接字符串,数据库会自动生成 先运行服务端,再运行客户端 如果服务端运行失败,请

统一身份认证和单点登录概念研究

在研究.建设单位信息系统的集成和登录时,自然想到了统一身份认证和单点登录,首先遇到了这样的问题,统一身份认证和单点登录的概念是什么,是不是某一个领域的术语,是不是有相应的标准和协议以及相关的解决方案,这让我对这两个经常关在嘴边的.耳熟能详的名称的来源产生了好奇.先从百度百科中可以查到统一身份认证的定义:所谓身份认证,就是判断一个用户是否为合法用户的处理过程.最常用的简单身份认证方式是系统通过核对用户输入的用户名和口令,看其是否与系统中存储的该用户的用户名和口令一致,来判断用户身份是否正确.复杂一

NET Core 2.0使用Cookie认证实现SSO单点登录

NET Core 2.0使用Cookie认证实现SSO单点登录 之前写了一个使用ASP.NET MVC实现SSO登录的Demo,https://github.com/bidianqing/SSO.Sample,这个Demo是基于.NET Framework,.NET Core 2.0出来了试着使用ASP.NET Core尝试一下.假如我们有三个站点 domain.dev order.domain.dev passport.domain.dev domain.dev作为我们的主站肯定是可以匿名访问

多系统实现单点登录方案:SSO 单点登录

一.什么是单点登录SSO(Single Sign-On) SSO是一种统一认证和授权机制,指访问同一服务器不同应用中的受保护资源的同一用户,只需要登录一次,即通过一个应用中的安全验证后,再访问其他应用中的受保护资源时,不再需要重新登录验证. 二.单点登录解决了什么问题 解决了用户只需要登录一次就可以访问所有相互信任的应用系统,而不用重复登录. 三.单点登录的技术实现机制 如下图所示: 认证后返回给应用系统而不是用户 注(图片所述存在的问题):单点登录对用户而言是透明的,它 只是保证子系统之间是相

Spring+ Spring cloud + SSO单点登录应用认证

之前的文章中有介绍spring cloud sso集成的方案,也做过spring + jwt + redis的解决方案,不同系统的无缝隙集成,统一的sso单点登录界面的管理.每个应用集成的权限认证,白名单等都是我们需要考虑的,现在针对于以上的问题我们做了sso单点登录应用认证平台,设计如下: 1. 数据库设计: Java代码 DROP TABLE IF EXISTS `sso_app_apply`; CREATE TABLE `sso_app_apply` ( `id` varchar(200)

互联网分布式微服务云平台规划分析--SSO单点登录系统

介绍 鸿鹄云架构[SSO单点登录系统]为所有微服务提供统一的用户认证服务,系统本身属于微服务模式,使用JWT+Redis分布式存储方案,确保不同微服务.系统之间的安全通讯和统一用户校验.认证.在整个服务平台中起着用户枢纽中心的作用. 平台基础功能 用户注册&登录.用户登录&校验(APP).用户登录&校验(PC).用户登出.用户密码修改.用户密码重置运行环境支持 开发工具:Eclipse.MyEclipse.Idea WEB容器:内置Tomcat JDK版本:1.8+ 系统支持:Wi

sso单点登录系统

sso单点登录概念 1.一处登录,处处登录.会单独做一个单点登录系统,只负责颁发token和验证token,和页面登录功能. 2.通过在浏览器cookie中放入token,和在redis中对应token放入用户信息的方式,代替session共享,使用jwt(json web token)自定义一个携带用户信息token加密算法. 3.cookie中的token是已经使用过的token,取名oldToken . url地址栏中的token新颁发的token,取名newToken 做法: 1.首先自

基于cookie的SSO单点登录系统 - waen - 博客园

原文:基于cookie的SSO单点登录系统 - waen - 博客园 利用数据库触发器实现定期自动增量更新缓存 原文地址:https://www.cnblogs.com/lonelyxmas/p/10434813.html