tomcat源码阅读之单点登录
一、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源码阅读之单点登录的更多相关文章
- Tomcat源码阅读(二)初始化
近来,我开始阅读tomcat的源码,感觉还挺清晰易懂:为了方便理解,我参考了网上的一些文章,把tomcat的组成归纳一下:整个tomcat的组成如下图所示: Tomcat在接收到用户请求时,将会通过以 ...
- cas客户端流程详解(源码解析)--单点登录
博主之前一直使用了cas客户端进行用户的单点登录操作,决定进行源码分析来看cas的整个流程,以便以后出现了问题还不知道是什么原因导致的 cas主要的形式就是通过过滤器的形式来实现的,来,贴上示例配置: ...
- tomcat源码阅读
1 工具准备 需要SVN.Maven.JDK.Eclipse.Eclipse M2插件 2 下载源码及发布包 源码在这里:http://svn.apache.org/repos/a ...
- tomcat源码阅读之过滤器
一.Servlet过滤器: 1.介绍: Servlet过滤器本身并不生成请求和响应对象,它只提供过滤作用. Servlet过滤器能够在Servlet被调用之前检查Request对象,修改Request ...
- tomcat源码阅读之SingleThreadModel
一.接口简介: 实现了SingleThreadModel接口的servlet类只能保证在同一时刻,只有一个线程执行该servlet实例的service方法,在tomcat实现中会创建多个servlet ...
- tomcat源码阅读之载入器(Loader)
一.Java类的载入器: 双亲委派模型: 1.JVM提供了三种类型的类加载器:引导类载入器(bootstrap class loader).扩展类载入器(extension class loader) ...
- tomcat源码阅读之安全机制
一.领域(Realm): 1.Principal接口代表角色信息,包含了三个成员:用户名.密码.role列表(以逗号分隔),对应了tomcat-users.xml文件中一行user信息: Generi ...
- tomcat源码阅读之BackupManager
一. 配置: <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOpti ...
- tomcat源码阅读之集群
一. 配置: 在tomcat目录下的conf/Server.xml配置文件中增加如下配置: <!-- Cluster(集群,族) 节点,如果你要配置tomcat集群,则需要使用此节点. clas ...
随机推荐
- Oracle11g温习-第一章 1、ORACLE实例
2013年4月27日 星期六 10:23 1.ORACLE 实例 System Global Area(SGA) 和 Background Process(后台进程) 称为数据库的实例. 2.ORAC ...
- CSS样式属性——背景
背景——包括背景颜色.背景图片,以及背景图片的控制 background-color:设置背景色(transparent表示透明的背景色) background-image:设置元素的背景图片 ba ...
- 使用a标签实现软件下载及下载量统计
通常最简单的软件下载就是采用如下方式: <a id="welcomeMiddleBtn" href="${basePath}/files/client/instal ...
- spring--mvc用戶注册用户名验重
spring--mvc用戶注册用户名验重 注册是验证用户名是否重复.post方法,当表单的用户名文本框失去焦点时,由ajax方法指定,进行@RequestMapping指定的url提交时调用的方法. ...
- vEthernet(默认交换机) 无法访问网络
VMware 开启虚拟机 最近公司由无线网转为有线时,我用VMware Workstation Pro装的几个系统,其中一个 ubuntu无法访问网页,在ubuntu运行ifconfig -a ,直接 ...
- 感知器、logistic与svm 区别与联系
https://blog.csdn.net/m0_37786651/article/details/61614865 从感知器谈起 对于典型的二分类问题,线性分类器的目的就是找一个超平面把正负两类分开 ...
- 蓝桥杯—ALGO-12 幂方分解(递归递推)
问题描述 任何一个正整数都可以用2的幂次方表示.例如: 137=27+23+20 同时约定方次用括号来表示,即ab 可表示为a(b). 由此可知,137可表示为: 2(7)+2(3)+2(0) 进一步 ...
- jsp jstl标签库核心标签
JSTL标签库介绍 JSTL标签库的使用时为了弥补html标签的不足,规范自定义标签的使用而诞生的.使用标签的目的就是不希望在jsp页面中出现java逻辑代码 全称:JSTL标签库分类 核心标签库使用 ...
- Filesystem has been set read-only problem.
case: when system is running well ,sudden tf became read-only; analyze: read the kernel log using dm ...
- 快播CEO王欣:流量跌到零也要转型
曾因免费与快捷而独霸视频播放器行业的快播科技,或许将迎来壮士断腕的艰难时刻. 4月16日晚,快播于新浪微博上先后发布<公告>和<致快播用户书:我们涅槃在即>,表示快播将启动商业 ...