多处使用,而在架构单点登录时,也会遇到一些小问题,在不同的应用环境中可以采用不同的单点登录实现方案来满足需求。

我将以我所遇到的应用环境以及在其中所经历的各个阶段与大家分享,若有不足,希望各位不吝赐教。

一、共享Session

共享Session可谓是实现单点登录最直接、最简单的方式。将用户认证信息保存于Session中,即以Session内存储的值为用户凭证,这在单个站点内使用是很正常也很容易实现的,而在用户验证、用户信息管理与业务应用分离的场景下即会遇到单点登录的问题,在应用体系简单,子系统很少的情况下,可以考虑采用Session共享的方法来处理这个问题。

这个架构我使用了基于Redis的Session共享方案。将Session存储于Redis上,然后将整个系统的全局Cookie Domain设置于顶级域名上,这样SessionID就能在各个子系统间共享。分布式Session共享解决方案,这篇推荐大家看下。

这个方案存在着严重的扩展性问题,首先,ASP.NET的Session存储必须为SessionStateItemCollection对象,而存储的结构是经过序列化后经过加密存储的。

并且当用户访问应用时,他首先做的就是将存储容器里的所有内容全部取出,并且反序列化为SessionStateItemCollection对象。

这就决定了他具有以下约束:

1.Session中所涉及的类型必须是子系统中共同拥有的(即程序集、类型都需要一致),这导致Session的使用受到诸多限制;

2.跨顶级域名的情况完全无法处理;

二、基于OpenId的单点登录

这种单点登录将用户的身份标识信息简化为OpenId存放于客户端,当用户登录某个子系统时,将OpenId传送到服务端,服务端根据OpenId构造用户验证信息,多用于C/S与B/S相结合的系统,流程如下:

由上图可以看到,这套单点登录依赖于OpenId的传递,其验证的基础在于OpenId的存储以及发送。

1.当用户第一次登录时,将用户名密码发送给验证服务;

2.验证服务将用户标识OpenId返回到客户端;

3.客户端进行存储;

4.访问子系统时,将OpenId发送到子系统;

5.子系统将OpenId转发到验证服务;

6.验证服务将用户认证信息返回给子系统;

7.子系统构建用户验证信息后将授权后的内容返回给客户端。

这套单点登录验证机制的主要问题在于他基于C/S架构下将用户的OpenId存储于客户端,在子系统之间发送OpenId,而B/S模式下要做到这一点就显得较为困难。为了处理这个问题我们将引出下一种方式,这种方式将解决B/S模式下的OpenId的存储、传递问题。

三、基于Cookie的OpenId存储方案

我们知道,Cookie的作用在于充当一个信息载体在Server端和Browser端进行信息传递,而Cookie一般是以域名为分割的,例如a.xxx.com与b.xxx.com的Cookie是不能互相访问的,但是子域名是可以访问上级域名的Cookie的。即a.xxx.com和b.xxx.com是可以访问xxx.com下的Cookie的,于是就能将顶级域名的Cookie作为OpenId的载体。

验证步骤和上第二个方法非常相似:

1、 在提供验证服务的站点里登录;

2、 将OpenId写入顶级域名Cookie里;

3、 访问子系统(Cookie里带有OpenId)

4、 子系统取出OpenId通过并向验证服务发送OpenId

5、 返回用户认证信息

6、 返回授权后的内容

在以上两种方法中我们都可以看到通过OpenId解耦了Session共享方案中的类型等问题,并且构造用户验证信息将更灵活,子系统间的验证是相互独立的,但是在第三种方案里,我们基于所有子系统都是同一个顶级域名的假设,而在实际生产环境里有多个域名是很正常的事情,那么就不得不考虑跨域问题究竟如何解决。

四、B/S多域名环境下的单点登录处理

在多个顶级域名的情况下,我们将无法让各个子系统的OpenId共享。处理B/S环境下的跨域问题,我们首先就应该想到JSONP的方案。

验证步骤如下:

1、 用户通过登录子系统进行用户登录;

2、 用户登录子系统记录了用户的登录状态、OpenId等信息;

3、 用户使用业务子系统;

4、 若用户未登录业务子系统则将用户跳转至用户登录子系统;

5、 用户子系统通过JSONP接口将用户OpenId传给业务子系统;

6、 业务子系统通过OpenId调用验证服务;

7、 验证服务返回认证信息、业务子系统构造用户登录凭证;(此时用户客户端已经与子业务系统的验证信息已经一一对应)

8、 将用户登录结果返回用户登录子系统,若成功登录则将用户跳转回业务子系统;

9、 将授权后的内容返回客户端;

五、安全问题

经过以上步骤,跨域情况下的单点登录问题已经可以得到解决。而在整个开发过程初期,我们采用用户表中纪录一个OpenId字段来保存用户OpenId,而这个机制下很明显存在一些安全性、扩展性问题。这个扩展性问题主要体现在一个方面:OpenId的安全性和用户体验的矛盾。

整个单点登录的机制决定了OpenId是会出现在客户端的,所以OpenId需要有过期机制,假如用户在一个终端登录的话可以选择在用户每次登录或者每次退出时刷新OpenId,而在多终端登录的情况下就会出现矛盾:当一个终端刷新了OpenId之后其他终端将无法正常授权。

而最终,我采用了单用户多OpenId的解决方案。每次用户通过用户名/密码登录时,产生一个OpenId保存在Redis里,并且设定过期时间,这样多个终端登录就会有多个OpenId与之对应,不再会存在一个OpenId失效所有终端验证都失效的情况。

Java面试单点登录_单点登录面试题相关推荐

  1. java判断用户是否在某一个区域登录_单点登录实现原理

    一.单点登录概念 什么是单点登录?单点登录全称 Single Sign On(以下简称SSO),是指在多系统应用群中登录一个系统,便可在其他所有系统中得到授权而无需再次登录,包括单点登录与单点注销两部 ...

  2. jwt单点登录_单点登录SSO技术选型

    一些人存在的意义总归是让另一些人成长,然后消失. --刘同<谁的青春不迷茫> 1.单点登录是什么? 单点登录主要用于多系统集成,即在多个系统中,用户只需要到一个中央服务器登录一次即可访问这 ...

  3. 合肥Java面试常考题_北大青鸟java 面试--常见面试题(中)

    上一文中,我们总结了java面试的基础,多线程,jvm的常见面试题,本文合肥北大青鸟合工大校区的袁老师继续介绍面试中网络.数据结构和算法.分布式理论和微服务的常见面试题. 一.网络 网络的话,主要集中 ...

  4. 浏览器时间久了重新登录_以登录为例讲解什么是全面的测试设计

    在面试时,面试官往往会出一个简单的场景让大家进行测试点设计来考察大家的测试设计能力,题目看似简单实则蕴藏杀机,测试人员需要根据自己的工作年限做出不同的回答方可过关.如果你工作1-2年,那么你只需要回答 ...

  5. A072_前台登录_三方登录

    目录 内容介绍 1. 前台登录-账号登录 1.1.前台登录 1.2.axios携带token-common.js 1.3.axios后置处理后台拦截错误-common.js 1.4.前台登录拦截-co ...

  6. Java面试进阶:Dubbo、Zookeeper面试题锦集

    Dubbo面试题锦集 1.默认也推荐使用netty框架,还有mina. 2.默认是阻塞的,可以异步调用,没有返回值的可以这么做. 3.推荐使用zookeeper注册中心,还有redis等不推荐. 4. ...

  7. Java面试题记不了怎么办_java面试题怎么记?java面试要注意什么?

    学习完java之后,大家肯定是要出去找java相关的工作的,并且找工作都要面试,为了能够在面试中显示出自己的能力,很多小伙伴都想知道java面试题怎么记?那么接下来,我们就来给大家讲解一下这方面的内容 ...

  8. SpringCloud工作笔记072---同一浏览器上不同标签页_tab页或者同一浏览器新开一个浏览器窗口也能实现单点登录_单点登录_localStorage_sessionStorage

    JAVA技术交流QQ群:170933152 注意用localStorage,存的token不会失效,可以在关闭浏览器的时候,清除或者设置一下过期时间,怎么做可以百度 注意:sessionStorage ...

  9. java调用微信加密_微信登录授权, 并且解密加密内容获取手机号和地区

    所使用的的依赖 org.springframework.boot spring-boot-starter-web 2.3.7.RELEASE org.apache.httpcomponents htt ...

  10. java三层架构实现登录_用户登录——三层架构

    1.MVC开发模式(web开发模式): M:model-------javabean(封装数据) V:view----------jsp(显示数据) C:controller----servlet(获 ...

最新文章

  1. HTML5动态分页效果代码
  2. python 拼多多秒杀_关于 拼多多笔试题-简单易懂的秒杀服务
  3. 一个关于从1到100的加法算法
  4. Ubuntu 14.04安装Chromium浏览器并添加Flash插件Pepper Flash Player-转
  5. 数据结构概念及连续存储数组的算法演示
  6. python pip 重新安装mysql_解决Ubuntu pip 安装 mysql-python包出错的问题
  7. Android Sutiod报错:Dx unsupported class file version 52.0(解决)
  8. ibatis中输入/输出各种类型的参数分析及#与$区别 (转)
  9. XP 多国语言包 .
  10. rhce考试试题以及答案_RedHat红帽认证 RHCE 7.0题库和答案
  11. iTEXT常用属性设置
  12. Word文档调整字间距的方法教程【收藏】
  13. 七个发布海外媒体稿件的关键点
  14. 给神经网络加入先验知识!
  15. 怎么解苹果7手机ID锁
  16. 拼图游戏 java_Java拼图游戏源码
  17. 忘记网站后台密码 PHP+mysql+md5 破解
  18. 小学生刚学计算机时先学什么,浅谈小学生应如何学习电脑
  19. ftp服务器空文件夹不让删,FTP不能删除(修改)文件夹的问题?(转载)
  20. 深圳-数据岗位面试不完全记录(回忆版)

热门文章

  1. 微信小程序自定义侧滑删除组件
  2. vue对table的某一行的数据进行编辑,删除,查看详情操作
  3. Ubuntu18.04设置阿里源
  4. 利用HTML完成登陆界面设计
  5. Activiti工作流引擎
  6. 龙果支付 mysql_龙果学院 基于电商业务的企业级大中台从设计到实现(第一阶段) 百度云 百度网盘...
  7. STC8H8K64U单片机学习-2-后续所需软件介绍
  8. rpa操作excel_一文看懂RPA与Excel宏的区别
  9. ipad关闭系统更新显示无服务器,iOS系统自动更新太烦?一招教你永久屏蔽 iOS 系统更新!...
  10. mw150um 驱动程序win10_win10系统版水星mw150us无线网卡驱动