一、SSO概念:

单点登录,Single Sign-On,简写为 SSO,是一个用户认证的过程,允许用户一次性进行认证后,就可访问系统中不同的应用;而无需要访问每个应用时,都重新输入用户和密码。

实现单点登录说到底就是要解决如何产生和存储那个信任,再就是其他系统如何验证这个信任的有效性,因此要点也就以下几个:

  • 存储信任
  • 验证信任

SSO 的实现机制大体分为 Cookie 机制和 Session 机制两大类。

Cookie机制的单点登录:

Session机制的单点登录:

二、单点登录配置:

这里以tomcat自带的docs和examples应用配置单点登录:

1、在docs应用的WEB-INF/web.xml文件中增加如下内容:

<security-constraint>

<web-resource-collection>

<web-resource-name>MySecurityTest</web-resource-name>

<url-pattern>/*</url-pattern>

</web-resource-collection>

<auth-constraint>

<role-name>admin-gui</role-name>

<role-name>manager-gui</role-name>

</auth-constraint>

</security-constraint>

<login-config>

<auth-method>BASIC</auth-method>

<realm-name>MySecurityTest</realm-name>

</login-config>

2、由于examples应用已经配置了安全验证,因此可以不用配置;

3、配置tomcat的conf目录下的server.xml文件,增加下面一行:

<Valve className="org.apache.catalina.authenticator.SingleSignOn" />

4、启动tomcat,先访问docs应用,弹出验证窗口,输入用户名或者密码后进入应用,然后再进入examples应用,不用输入用户名和密码,直接进入应用,说明单点登录生效。

三、单点登录实现原理:

1、相关实现类说明:

SingleSignOnSessionKey类保存了单点登录时的session信息,保存了sessionId, 应用名称和Host的名称;

SingleSignOnEntry保存了单点登录时的一个SSOID的信息(也就是一个登录账号的信息),保存了用户名、密码、验证方式等基本信息,也保存了SingleSignOnSessionKey类实例的集合,可以通过addSession和removeSession添加和删除;

SingleSignOn作为单点登录实现的服务类,cache保存了SSOID和SingleSignOnEntry的hash键值对,register函数将指定的SSOID和session保存到cache,deregister从cache中删除SSOID,同时调用expire将该SSOID关联的session失效,update从cache中查找指定SSOID的SingleSignOnEntry,并更新其中对应的单点信息,reauthenticate根据保存的单点信息重新登录验证并生成新的principal,然后更新缓存里面的principal,removeSession根据SSOID在cache中查找SingleSignOnEntry,然后从SingleSignOnEntry实例中删除对应的session,如果该SingleSignOnEntry中关联的session都已经被删除了,则调用deregister释放该SSOID对应的单点信息;associate会调用addSession添加单点登录的session;

2、SingleSignOn类集成自ValveBase类,说明他也是一个阀,只是他是挂在host的pipeline上的,因此他的invoke总是先于context.pipeline里面的valve的invoke执行;

3、单点登录代码流程解读:

a)   由于SingleSignOn阀是挂在host上,因此第一次验证请求总是先到达SingleSignOn阀的invoke方法,由于此时SingleSignOn中的缓存还没缓存任何的SSO信息,且cookie中不含有单点登录的cookie信息,所以SingleSignOn阀的invoke方法不做任何处理;

b)   BasicAuthenticator验证器在验证成功后,会调用register方法保存principal信息:

c)   AuthenticatorBase的register方法中首先给cookie中添加JSESSIONIDSSO值:

然后将该SSOID和单点信息注册到SingleSignOn中:

d)   当客户端再次访问请求其他需要安全验证的应用时,request请求首先到达SingleSignOn阀的invoke方法, SingleSignOn根据cookie中的SSOID值查找对应的SingleSignOnEntry,将SingleSignOnEntry中的principal设置到request中:

e)   然后request请求到达AuthenticatorBase的invoke方法,再到达BasicAuthenticator.authenticate方法,在这里首先从request取出principal,如果取到了则直接返回验证成功而不用再让用户去输入用户名密码验证:

tomcat源码阅读之单点登录的更多相关文章

  1. Tomcat源码阅读(二)初始化

    近来,我开始阅读tomcat的源码,感觉还挺清晰易懂:为了方便理解,我参考了网上的一些文章,把tomcat的组成归纳一下:整个tomcat的组成如下图所示: Tomcat在接收到用户请求时,将会通过以 ...

  2. cas客户端流程详解(源码解析)--单点登录

    博主之前一直使用了cas客户端进行用户的单点登录操作,决定进行源码分析来看cas的整个流程,以便以后出现了问题还不知道是什么原因导致的 cas主要的形式就是通过过滤器的形式来实现的,来,贴上示例配置: ...

  3. tomcat源码阅读

    1      工具准备 需要SVN.Maven.JDK.Eclipse.Eclipse M2插件 2      下载源码及发布包 源码在这里:http://svn.apache.org/repos/a ...

  4. tomcat源码阅读之过滤器

    一.Servlet过滤器: 1.介绍: Servlet过滤器本身并不生成请求和响应对象,它只提供过滤作用. Servlet过滤器能够在Servlet被调用之前检查Request对象,修改Request ...

  5. tomcat源码阅读之SingleThreadModel

    一.接口简介: 实现了SingleThreadModel接口的servlet类只能保证在同一时刻,只有一个线程执行该servlet实例的service方法,在tomcat实现中会创建多个servlet ...

  6. tomcat源码阅读之载入器(Loader)

    一.Java类的载入器: 双亲委派模型: 1.JVM提供了三种类型的类加载器:引导类载入器(bootstrap class loader).扩展类载入器(extension class loader) ...

  7. tomcat源码阅读之安全机制

    一.领域(Realm): 1.Principal接口代表角色信息,包含了三个成员:用户名.密码.role列表(以逗号分隔),对应了tomcat-users.xml文件中一行user信息: Generi ...

  8. tomcat源码阅读之BackupManager

    一. 配置: <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOpti ...

  9. tomcat源码阅读之集群

    一. 配置: 在tomcat目录下的conf/Server.xml配置文件中增加如下配置: <!-- Cluster(集群,族) 节点,如果你要配置tomcat集群,则需要使用此节点. clas ...

随机推荐

  1. Oracle to_char()和to_date()函数的用法

    to_char()函数是我们经常使用的函数,下面就为您详细介绍Oracle to_date()函数的用法 1.to_char()函数分析 1)SQL中不区分大小写,MM和mm被认为是相同的格式代码 先 ...

  2. linux tcpdump 抓包

    tcpdump是linux命令行下常用的的一个抓包工具,记录一下平时常用的方式,测试机器系统是ubuntu 12.04. tcpdump的命令格式 tcpdump的参数众多,通过man tcpdump ...

  3. angular封装jquery插件(组件)

    http://www.phloxblog.in/jquery-plugin-angular-js-directive-clean-html-approach/#.VaCWL9yUemJ

  4. (C#基础)创建文件,文件夹

    文件夹,文件这是常见的,怎么创建?要不要先判断是否存在?非常非常基础的知识点. 代码 using System; using System.Collections.Generic; using Sys ...

  5. Android消息通信 第三方开源项目EventBus 的用法

    EventBus是github上的一个第三方开发库,其在github上的项目主页地址:https://github.com/greenrobot/EventBus EventBus的消息模型是消息发布 ...

  6. Fedora 安装与常用命令

    fedora下载地址: https://getfedora.org/ 原来装的26,现在装27 用的是server版网络安装500多M 现在都是U盘安装了,fedora的写优盘说明 https://f ...

  7. 浅谈:当程序员的N多好处,逆袭高富师

    选择一份职业,除了要要分析有没有钱途外(为什么要选择 IT 行业,IT 业有多火爆你造吗?),还要平衡其他方面的利弊.有很多想进入这个行业的小伙伴问我,程序员到底有什么好处.看样子这是很多小伙伴关心的 ...

  8. LINK : fatal error LNK1123

    转: LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 这个是由于日志文件引起的,可以将 项目\属性\配置属性\清单工具\输入和输出\嵌入清单:原来 ...

  9. DevExpress WPF入门指南:跟随 Items Source 向导完成数据绑定

    Items Source Wizard Items Source Configuration Wizard允许在设计时执行数据绑定.跟随这个向导可以自动生成XAML数据绑定代码. 下面就来展示下如何使 ...

  10. C语言基础:指针初级(补充) 分类: iOS学习 c语言基础 2015-06-10 21:54 19人阅读 评论(0) 收藏

    结构体指针:指向结构体指针的变量的指针. 结构体指针指向结构体第一个成员变量的首地址 ->:   指向操作符 定义的指针变量必须指向结构体的首地址,才可以使用  ->  访问结构体成员变量 ...