- 浏览: 190292 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (153)
- 小技巧 (14)
- spring (3)
- struts2 (20)
- hibernate (0)
- java api (2)
- java se (8)
- jsp/servlet (4)
- oracle (0)
- mysql (1)
- ms sqlserver (1)
- js (30)
- jquery (8)
- ajax (2)
- .net (1)
- 软件 (1)
- j2ee (25)
- 网址收藏 (3)
- web综合 (9)
- web打印控件 (3)
- fckeditor (2)
- Groovy (1)
- PHP (5)
- 项目管理 (1)
- SEO (1)
- PostgreSQL (5)
- CKeditor (1)
- Fusion chart (1)
- 网页播放器 (1)
- 曾遇bug (3)
- java日志 (1)
- linux/Unix/CentOs (5)
- VBA (1)
- C# (0)
- 日期控件 (1)
- tomcat (2)
- cookies (1)
- java7 (1)
- JAVA文件操作 (2)
- hibernate;ehcache (2)
- 缓存 (1)
- dd (0)
- DB (1)
- android (2)
最新评论
-
flyingbin:
沙发,不过从头到尾没怎么看懂~
Windows密码本地破解通用方法 -
jfeimao:
credentialsToPrincipalResolvers ...
CAS(单点登陆)---总结一 -
haige18:
这两张图片引用的是网易的地址,现在资源有可能被删除了,所以就显 ...
Struts2中的Value Stack/Stack Context -
fengzhisha0914:
我的图片也不显示了..为何...
Struts2中的Value Stack/Stack Context -
greatwqs:
java.lang.IllegalStateException ...
java.lang.IllegalStateException:Cannot forward after response has been committed
本篇文章是对JA-SIG CAS(v3.3)的初步调研总结。
一 配置实例
应用场景: cas 服务部署在192.168.7.115 ,是一个web 应用,访问地址为:https://cas.mycompany.com:8443/cas/ 。web1 应用位于192.168.7.90 ,访问地址为:http://192.168.7.90:8081/web1 ,web2 应用位于192.168.7.90 ,访问地址为:http://192.168.7.90:8082/web2 。web1 和web2 通过cas 服务实现SSO 功能。浏览器位于本地localhost 。
cas 服务器: 192.168.7.115 启动8443 端口,需配置证书
web1 : 192.168.7.90
hosts 配置: 192.168.7.115 cas.mycompany.com
web.xml 里的配置:
<context-param>
<param-name>casServerUrlPrefix</param-name>
<param-value>https://cas.mycompany.com:8443/cas/</param-value>
</context-param>
<context-param>
<param-name>serverName</param-name>
<param-value>192.168.7.90:8081</param-value>
</context-param>
<filter>
<filter-name>CAS Authentication Filter</filter-name>
<filter-class>
org.jasig.cas.client.authentication.AuthenticationFilter
</filter-class>
<init-param>
<param-name>casServerLoginUrl</param-name>
<param-value>https://cas.mycompany.com:8443/cas/login</param-value>
</init-param>
</filter>
<filter>
<filter-name>CAS Validation Filter</filter-name>
<filter-class>
org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS Authentication Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CAS Validation Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
JDK 启动参数需加上( 验证CAS 服务器证书的需要) :
-Djavax.net.ssl.trustStore=/home/yz/web1/conf/cas-client-trust-cert.jks
-Djavax.net.ssl.trustStorePassword=casclient!@#
web2 : 192.168.7.90
hosts 配置: 192.168.7.115 cas.mycompany.com
web.xml 里的配置:
同web1 里web.xml 的配置,只是serverName 属性的值变成了192.168.7.90:8082
JDK 启动参数需加上( 验证CAS 服务器证书的需要) :
-Djavax.net.ssl.trustStore=/home/yz/web2/conf/cas-client-trust-cert.jks
-Djavax.net.ssl.trustStorePassword=casclient!@#
本地 :hosts 配置: 192.168.7.115 cas.mycompany.com
注:
1 casServerLoginUrl 参数的值是cas 服务器login 接口的值。web 应用里的cas client 在认证的时候会redirect 到 cas 服务器,redirect 的url 就是casServerLoginUrl ,因为是redirect ,所以浏览器所在机器要配置cas 服务器的域名。
2 casServerUrlPrefix 参数的值是cas 服务的访问地址。cas client 验证ticket 的时候,要访问cas 服务的/serviceValidate 接口,使用的url 就是${ casServerUrlPrefix }serviceValidate ,因为客户web 应用要验证cas 的证书,所以证书cn 字段的值必须和casServerUrlPrefix 里设置的cas 服务器的域名保持一致,并且在web 应用的服务器上配置cas 服务的访问域名。
2 serverName 参数,cas client 会用来生成service 参数,并且cas 服务器在认证通过、ticket 验证通过后,会redirect 到web 应用,redirect 的url 就是service 参数的值。serverName 参数可以是IP ,也可以是域名,只要保证浏览器能访问到即可。
二 CAS 简单介绍
CAS 官方网站: http://www.jasig.org/cas
CAS 的主要文档:
http://www.ja-sig.org/wiki/display/CASUM/Home
http://www.jasig.org/cas/cas1-architecture
http://www.jasig.org/cas/cas2-architecture
http://www.jasig.org/cas/protocol/
http://www.ja-sig.org/wiki/display/CASUM/Demo
CAS 官方网站上的介绍图
主要原理:用户第一次访问一个CAS 服务的客户web 应用时(访问URL :http://192.168.7.90:8081/web1 ),部署在客户web 应用的cas AuthenticationFilter ,会截获此请求,生成service 参数,然后redirect 到CAS 服务的login 接口,url 为https://cas:8443/cas/login?service=http%3A%2F%2F192.168.7.90%3A8081%2Fweb1%2F ,认证成功后,CAS 服务器会生成认证cookie ,写入浏览器,同时将cookie 缓存到服务器本地,CAS 服务器还会根据service 参数生成ticket,ticket 会保存到服务器,也会加在url 后面,然后将请求redirect 回客户web 应用,url 为http://192.168.7.90:8081/web1/?ticket=ST-5-Sx6eyvj7cPPCfn0pMZuMwnbMvxpCBcNAIi6-20 。这时客户端的AuthenticationFilter 看到ticket 参数后,会跳过,由其后面的TicketValidationFilter 处理,TicketValidationFilter 会利用httpclient 工具访问cas 服务的/serviceValidate 接口, 将ticket 、service 都传到此接口,由此接口验证ticket 的有效性,TicketValidationFilter 如果得到验证成功的消息,就会把用户信息写入web 应用的session 里。至此为止,SSO 会话就建立起来了,以后用户在同一浏览器里访问此web 应用时,AuthenticationFilter 会在session 里读取到用户信息,所以就不会去CAS 认证,如果在此浏览器里访问别的web 应用时,AuthenticationFilter 在session 里读取不到用户信息,会去CAS 的login 接口认证,但这时CAS 会读取到浏览器传来的cookie ,所以CAS 不会要求用户去登录页面登录,只是会根据service 参数生成一个ticket ,然后再和web 应用做一个验证ticket 的交互而已。
二 CAS 客户端 Filter 的处理逻辑
1 AuthenticationFilter
if(url 中无ticket 参数 && session 中没有TicketValidationFilter 置的assertion 对象){
response.sendRedirect(cas 服务器的/login 接口);// 生成service 参数,添加到url 后面
}
else{
不做处理
}
2 TicketValidationFilter
if(url 中有ticket 参数){
通过httpclient 工具访问cas 服务器的/serviceValidate 接口验证ticket 的有效性,验证失败,显示错误页面,验证成功,则生成标识用户身份的assertion 对象,放入session 。
}
else{
不做处理
}
注:
1 AuthenticationFilter 在前,TicketValidationFilter 在后。
2 AuthenticationFilter :
1 )url 中无ticket 参数,且session 中没有TicketValidationFilter 置的assertion 对象,这种情况说明用户还没有认证,AuthenticationFilter 会去做认证处理;
2 )url 中无ticket 参数,且session 中有TicketValidationFilter 置的assertion 对象,这种情况说明用户已经认证成功,AuthenticationFilter 不做处理;
3 )url 中有ticket 参数,这种情况说明用户已经认证成功,但还需要经TicketValidationFilter 去验证ticket,AuthenticationFilter 不做处理。
3 TicketValidationFilter :只有客户端调用cas 服务器的/login 接口, 并成功认证,redirect 回客户端时,url 里才带有ticket 参数,在这种情况下,TicketValidationFilter 才做处理。
三 CAS 服务端的处理逻辑
CAS 服务端总共对外暴露了7 个接口,客户端通过访问这7 个接口与服务端交互,这7 个接口为:/login 、/logout 、/validate 、/serviceValidate 、/proxy 、/proxyValidate 、/CentralAuthenticationService 。/login 是认证接口,/logout 是退出接口,负责销毁认证cookie,/validate 、/serviceValidate 是验证ticket 用的接口,其中/validate 是CAS1.0 定义的,/serviceValidate 是CAS2.0 定义的,其中/serviceValidate 返回xml 格式的数据,/proxy 、/proxyValidate 是支持代理认证功能的接口,/CentralAuthenticationService 接口用于和远程的web services 交互。对于一般web 应用的单点登录来讲,/login 、/logout 、/serviceValidate 这3 个接口已经可以满足要求 。CAS 协议中已经对这些接口做了定义,链接为:http://www.jasig.org/cas/protocol 。下面是我对CAS 各个接口实现的的详细说明。
/login:
登录流程这部分要考虑到不同种类用户凭证的获取方案,以及客户应用传来的service 、gateway 、renew 参数的不同取值组合,CAS 为了实现流程的高度可配置性,采用了Spring Web Flow 技术。通过阅读CAS 发布包里的login-webflow.xml 、cas-servlet.xml 、applicationContext.xml 这3 个文件,我找出 了登录有关的所有组件,并画出了它的处理流程图。
CAS 默认的登录处理流程
第一次访问Web 应用的流程走向
已经登录web1 后,访问web1 的资源(web1 没有启动session ),或访问web2 的资源
注:
1 : InitialFlowSetupAction: 是流程的入口。用 request.getContextPath() 的值来设置 cookie 的 Path 值, Cookie 的 path 值是在配置文件里定义的,但这个 Action 负责将 request.getContextPath() 的值设置为 Cookie 的 path 值,这是在 cas 部署环境改变的情况下,灵活地设置 cookie path 的方式;把 cookie 的值以及 service 参数的值放入 requestContext 的 flowscope 里。
2 : GenerateServiceTicketAction 此 Action 负责根据 service 、 GTC cookie 值生成 ServiceTicket 对象, ServiceTicket 的 ID 就是返回给客户应用的 ticket 参数,如果成功创建 ServiceTicket ,则转发到 WarnAction ,如果创建失败,且 gateway 参数为 true ,则直接 redirect 到客户应用, 否则则需要重新认证。
3 : viewLoginForm 这是登录页面, CAS 在此收集用户凭证。 CAS 提供的默认实现是 /WEB-INF/view/jsp/simple/ui/casLoginView.jsp 。
4 : bindAndValidate 对应 AuthenticationViaFormAction 的 doBind 方法,该方法负责搜集登录页面上用户录入的凭证信息(用户名、密码等),然后把这些信息封装到 CAS 内部的 Credentials 对象中。用户在 casLoginView.jsp 页面上点击提交后,会触发此方法。
5:submit 对应 AuthenticationViaFormAction 的 submit 方法 , 如果 doBind 方法成功执行完, 则触发 submit 方法,此方法负责调用 centralAuthenticationService 的 grantServiceTicket 方法,完成认证工作,如果认证成功,则生成 TicketGrantingTicket 对象,放在缓存里, TicketGrantingTicket 的 ID 就是 TGC Cookie 的 value 值。
6 : warn CAS 提供了一个功能:用户在一个 web 应用中跳到另一个 web 应用时, CAS 可以跳转到一个提示页面,该页面提示用户要离开一个应用进入另一个应用,可以让用户自己选择。用户在登录页面 viewLoginForm 上选中了 id=”warn” 的复选框,才能开启这个功能。
WarnAction 就检查用户有没有开启这个功能,如果开启了,则转发到showWarnView, 如果没开启,则直接redirect 到客户应用。
7 :SendTicketGrantingTicketAction 此Action 负责为response 生成TGC Cookie ,cookie 的值就是 AuthenticationViaFormAction 的 submit 方法生成的 TicketGrantingTicket 对象的 ID 。
8 : viewGenerateLoginSuccess 这是 CAS 的认证成功页面。
/logout: ( 对应实现类 org.jasig.cas.web.LogoutController )
处理逻辑:
1) removeCookie
2) 在服务端删除TicketGrantingTicket 对象(此对象封装了cookie 的value 值)
3 )redirect 到退出页面,有2 种选择:
if(LogoutController 的followServiceRedirects 属性为true 值,且url 里的service 参数非空){
redirect 到 sevice 参数标识的url
}
else{
redirect 到内置的casLogoutView (cas/WEB-INF/view/jsp/default/ui/casLogoutView.jsp ),如果url 里有url 参数,则此url 参数标识的链接会显示在casLogoutView 页面上。
}
/serviceValidate: (对应实现类 org.jasig.cas.web.ServiceValidateController )
处理逻辑:
如果service 参数为空或ticket 参数为空,则转发到failureView (/WEB-INF/view/jsp/default/protocol/2.0/casServiceValidationFailure.jsp )
验证ticket 。以ticket 为参数,去缓存里找ServiceTicketImpl 对象,如果能找到,且没有过期,且ServiceTicketImpl 对象对应的service 属性和service 参数对应,则验证通过,验证通过后,请求转发至casServiceSuccessView (cas/WEB-INF/view/jsp/default/protocol/2.0/casServiceValidationSuccess.jsp ),验证不通过,则转发到failureView 。
四 认证相关的概念及流程
概念
-
Credentials 用户提供的用于登录用的凭据信息,如用户名/ 密码、证书、IP 地址、Cookie 值等。比如 U sernamePasswordCredentials ,封装的是用户名和密码。CAS 进行认证的第一步,就是把从UI 或request 对象里取到的用户凭据封装成Credentials 对象,然后交给认证管理器去认证。
-
AuthenticationHandler 认证Handler, 每种AuthenticationHandler 只能处理一种Credentials ,如 AbstractUsernamePasswordAuthenticationHandler 只负责处理 U sernamePasswordCredentials 。
-
Principal 封装用户标识,比如 SimplePrincipal, 只是封装了用户名。认证成功后, credentialsToPrincipalResolvers 负责由 Credentials 生成 Principal 对象。
-
CredentialsToPrincipalResolvers 负责由 Credentials 生成 Principal 对象,每种 CredentialsToPrincipalResolvers 只处理 一种Credentials ,比如 UsernamePasswordCredentialsToPrincipalResolver 负责从 U sernamePasswordCredentials 中取出用户名,然后将其赋给生成的 SimplePrincipal 的 ID 属性。
-
AuthenticationMetaDataPopulators 负责将 Credentials 的一些属性赋值给 Authentication 的 attributes 属性。
-
Authentication Authentication是认证管理器的最终处理结果, Authentication 封装了 Principal ,认证时间,及其他一些属性(可能来自 Credentials )。
-
AuthenticationManager 认证管理器得到 Credentials 对象后,负责调度AuthenticationHandler 去完成认证工作,最后返回的结果是 Authentication 对象。
-
CentralAuthenticationService CAS 的服务类,对 Web 层提供了一些方法。该类还负责调用 AuthenticationManager 完成认证逻辑。
序列图
CAS 认证处理序列图
类图
CAS 认证类图
来自:http://www.iteye.com/topic/544899
发表评论
-
Java 连接access 使用access文件 不用配置
2012-05-23 09:43 909String url = "jdbc:od ... -
在Java 7里如何对文件进行操作
2012-04-25 16:53 744下面的代码片段是由经过验证的程序修改而来。观察这些代码片段你会 ... -
Java将中文转换成拼音,用于字母的模糊查询
2012-04-23 15:05 1879/** * 将汉字转换为拼音 * ... -
JSON+Jquery实现页面动态加载
2011-12-09 18:10 828看附件 -
轻松实现Apache,Tomcat集群和负载均衡
2011-04-29 09:42 736作者:罗代均 ldj_work#126.com,转载请保 ... -
Java或web中解决所有路径问题
2011-04-28 21:48 715Java中使用的路径, ... -
基于jquery的上传插件Uploadify
2010-11-26 17:24 980无论是做Web产品还是Web项目,文件上传是经常要用到的功 ... -
JSP中的两种包含页面的方法
2010-11-09 11:47 762写道 第一种:include指令:当JSP转换成Servle ... -
pager-taglib 使用说明
2010-11-03 22:10 936http://www.iteye.com/topic/6265 ... -
jFreeChart 在jsp页上实现简单的折线图、柱状图
2010-10-31 13:57 1997可参考资料与网址 官方网站 http://www ... -
SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎
2010-10-31 11:22 910SSH + Lucene + 分页 + 排序 + 高亮 ... -
CAS客户端证书认证登录
2010-10-31 11:09 1919前端时间需要实现公司内网证书自动登录CAS. 由于对CAS的 ... -
CAS(单点登陆)---总结一
2010-10-31 11:05 1370单点登录(sso)是指基 ... -
单点登录CAS Server 介绍
2010-10-31 11:04 945下面的讲解基于CAS Server ... -
CAS(单点登陆)---总结二
2010-10-31 11:01 840返回更多用户信息继... 配置ssoAuth/WEB-INF ... -
java 防sql注入
2010-10-27 21:29 846package com.cssweb.webcall.util ... -
防止未登录进行操作 解决登录页面内嵌问题
2010-10-27 21:28 1412防止未登录进行操作 解决登录页面内嵌问题 1.进入登录的 ... -
fckeditor的使用
2010-10-27 21:17 763先根据上一篇博文下载FckEditor的工具 1.简单的例子 ... -
网页在线编辑器 fckeditor
2010-10-27 21:16 1045几种常见的网页在线编 ... -
解决地址栏传输中文问题
2010-10-27 21:10 816一、传统的方法,修改tomcat/conf/server.xm ...
相关推荐
在这个初步调研中,我们关注的是CAS v3.3版本的配置和应用场景。 首先,CAS服务器被部署在192.168.7.115上,它是一个运行在8443端口的Web应用,对外提供HTTPS服务,访问地址为https://cas.mycompany.com:8443/cas/...
这个压缩包“H3C CAS总结.zip”包含了丰富的资料,包括经验文件夹、配置案例、开局手册等,这些都是理解和掌握H3C CAS的重要资源。 首先,我们来看“CAS维护实验”。这个文件夹可能包含了一系列的实践操作教程,...
【CAS 单点登录】是一种身份验证协议,用于在多个应用系统之间提供统一的登录体验。CAS(Central Authentication Service)由 Jasig 组织开发,它允许用户在一次登录后,即可访问所有集成该服务的应用,无需多次输入...
CAS(Central Authentication Service)是Java开发的一个开源的单点登录(Single Sign-On,简称SSO)框架,主要用于解决网络应用中的身份验证问题。本压缩包提供了CAS服务端自定义认证的实现,以及CAS客户端的配置...
3. **集成CAS客户端库**:在外部系统中,需要集成CAS客户端库,如Java CAS Client、Spring Security CAS等,它们负责处理与CAS服务器的交互,包括重定向用户到CAS登录页面、接收和验证服务票证。 4. **配置客户端...
总结,自定义CAS登录页面涉及到前端页面设计、后端配置以及与CAS服务器的交互等多个方面。通过上述步骤,你可以实现一个既满足品牌需求又具备良好安全性的自定义登录页面。记住,每个环节都需仔细测试,确保其功能...
H3C_CAS_LINUX安装cas-tools 在虚拟化环境中,安装 CAS Tools 是一个非常重要的步骤。CAS Tools 是一个功能强大的虚拟化管理平台,能够帮助管理员更方便地管理和维护虚拟机。下面,我们将详细介绍如何在 Linux 系统...
cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x集成cas4.1.x...
CAS(Central Authentication Service)是Java开发的一个开源身份验证框架,主要功能是提供单点登录(Single Sign-On,SSO)服务。在企业环境中,尤其是在已部署了Active Directory(AD)域服务的情况下,将CAS与AD...
网上关于CAS的技术文章鱼龙混杂,我在这里整理出比较优秀和好用的文章,结合起来可以完成CAS的搭建
CAS(Central Authentication Service)是Java开发的一个开源身份验证框架,主要用于实现单点登录(Single Sign-On,SSO)。本教程将详细介绍如何搭建CAS服务,并将其与SQL Server数据库和Spring Security进行集成。...
总结起来,"idea中导入cas"是一个包含下载源码、创建Idea项目、配置编译环境、运行调试等多个环节的过程,旨在提升开发和维护CAS服务的效率。对于开发者来说,熟练掌握这个流程不仅能提高工作效率,还能更好地理解和...
CAS(Central Authentication Service)是耶鲁大学开发的一种开放源代码的单点登录(Single Sign-On,简称SSO)协议,用于网络应用中的身份验证。它允许用户在一个认证点登录后,无需再次输入凭证就能访问其他受保护...
### CAS Restful接口调用详解 #### 一、CAS简介 CAS(Central Authentication Service)是一种开源的单点登录协议和服务实现。它旨在减轻单一Web应用的登录流程,并为多个服务提供一个集中式的认证机制。CAS支持...
总结来说,这个压缩包包含了一个CAS服务器的实现、两个可能的客户端实现,以及证书生成的命令,提供了一整套实现CAS SSO的环境。在实际部署时,你需要根据自己的需求配置证书、CAS服务器和客户端,确保安全、有效地...
CAS(Central Authentication Service)是一种广泛使用的开放源码身份验证框架,它允许用户通过单一登录(Single Sign-On,SSO)访问多个应用系统。在你提供的资料中,"Cas5.2.6(cas-overlay-template-5.2.6)服务端...
总结一下,Struts2+CAS的单点登录集成涉及到的主要知识点包括:CAS的工作流程、Struts2框架的拦截器机制、Web应用的过滤器配置以及安全认证的实现。通过这个简单的示例,开发者可以学习如何在自己的项目中实施SSO,...
H3C CAS 3.0版 H3C CAS 3.0产品培训胶片 H3C CAS-云计算管理平台技术白皮书V2.0 H3C CAS-云计算管理平台 安装指导-5W101-整本手册 H3C CAS-维护手册V2.0 H3C CAS-工程开局指导手册V2.0 H3C CAS-Rest API H3C ...
CAS(Central Authentication Service)是一种基于Web的单一登录(Single Sign-On, SSO)协议,它允许用户通过一个认证过程访问多个应用系统,而无需为每个系统单独登录。CAS 4.1.7是该框架的一个特定版本,发布于...
【标题】"CAS修改登录页"是一个针对中央认证服务(Central Authentication Service,简称CAS)的定制化实践。在单点登录(Single Sign-On,SSO)系统中,CAS扮演着核心角色,它提供了统一的身份验证服务,使得用户只...