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 ...
随机推荐
- 『科学计算』科学绘图库matplotlib学习之绘制动画
基础 1.matplotlib绘图函数接收两个等长list,第一个作为集合x坐标,第二个作为集合y坐标 2.基本函数: animation.FuncAnimation(fig, update_poin ...
- Java远程调试 java -Xdebug各参数说明
JAVA自身支持调试功能,并提供了一个简单的调试工具--JDB,类似于功能强大的GDB,JDB也是一个字符界面的 调试环境,并支持设置断点,支持线程线级的调试 JAVA的调试方法如下: 1.首先支持J ...
- 一、重写(覆盖)override
一.重写(覆盖)override 子类可以继承父类对象的方法,在继承后,重复提供该方法,就叫做方法的重写,又叫做覆盖override package property; //父类对象 public c ...
- splunk LB和scale(根本在于分布式扩展index,search)
Forwarder deployment topologies You can deploy forwarders in a wide variety of scenarios. This topic ...
- PHP:第三章——PHP中嵌套函数和条件函数
PHP中的嵌套函数: <?php header("Content-Type:text/html;charset=utf-8"); function A(){ echo &qu ...
- FZU 2124 吃豆人 bfs
题目链接:吃豆人 比赛的时候写的bfs,纠结要不要有vis数组设置已被访问,没有的话死循环,有的话就不一定是最优解了.[此时先到的不一定就是时间最短的.]于是换dfs,WA. 赛后写了个炒鸡聪明的df ...
- POJ 2488 DFS
DES:给一个n行m列的棋盘.马以L型走.问能否从某一位置开始走完棋盘上的每个位置.若能继续输出字典序最小的一条路径. 很典型的dfs.搜的时候就按照字典序从小到大的顺序.搜到第一条路径时停止搜索输出 ...
- linux thtree level page tables
To translate a virtual address into a physical one, the CPU must take the contents of each level fie ...
- Python - Learn Note (3)
Python之模块 包就是文件夹:包可以有多级: 模块就是 xxx.py文件:可以创建自己的模块,并且导入它们,模块的名字就和文件的名字相同: Python使用import语句导入一个模块. impo ...
- 组数排序非sort
<!doctype html> <html> <head> <meta charset="utf-8"> <meta name ...