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 ...
随机推荐
- bzoj2242: [SDOI2011]计算器 BSGS+exgcd
你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值:(快速幂) 2.给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数:(exgcd) 3.给 ...
- Graph (floyd)
Description Everyone knows how to calculate the shortest path in a directed graph. In fact, the oppo ...
- HDOJ1009
#include "iostream" #include "algorithm" #include "cstdio" using names ...
- OAF多语言的实现
在之前的文章中转载了一篇关于多语言实现的文章. OAF中多语言的实现(转) 现在我来讲讲另外一种情况. 在建立工程项目没有特别选择语言,所以所有的PG或RN页面都是英文的,在页面原文件中可看到如下内容 ...
- python 使用yield进行数据的流式处理
demo:从文件中取包含字符“a”的5行数据做一次批处理!!! # coding: utf-8 import time def cat(f): for line in f: yield line de ...
- laravel中的DB facade实现数据的CURD
/* $students=DB::select("select * from student"); var_dump($students);*/ //新增数据: /*$bool=D ...
- Awk 从入门到放弃 (8) 动作总结之三
awk continue 语句 awk exit 语句 awk if 语句 awk next 语句 awk break 语句
- VS2010创建动态链接库(DLL)的方法
1.第一步创建WIN32项目,选择DLL 2.第二步,创建你自己的DLL CPP文件和头文件,下面以两个简单的加减法函数为例子导出 然后编译生成即可.DLL文件在Debug或Release目录中 .d ...
- 使用array_merge重新排列数组下标
array_merge() 函数把两个或多个数组合并为一个数组. 如果键名有重复,该键的键值为最后一个键名对应的值(后面的覆盖前面的).如果数组是数字索引的,则键名会以连续方式重新索引. 注释:如果仅 ...
- 玩转X-CTR100 l STM32F4 l DRV8825 A4988 步进电机控制
我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] 本文介绍X-CTR100控制器控制步进电机 ...