- 浏览: 448075 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (108)
- Ibatis (0)
- ZK (13)
- 设计模式 (3)
- Java编程 (21)
- 正则表达式 (2)
- 开发小续 (2)
- 杂谈 (1)
- 数据库 (6)
- Hibernate (6)
- Struts 2 (2)
- Spring (2)
- 版本控制 (4)
- Subversion (1)
- Myeclipse (1)
- EL (1)
- jsp (1)
- CAS (1)
- SSO (1)
- Restful Web Service (3)
- jersey (2)
- jersey与spring (1)
- web service框架 (1)
- 系统分析 (1)
- Subversion windows service (1)
- tomcat (1)
- PermGen Space (1)
- 编程心得 (1)
- google map api (1)
- springmvc (1)
- ajax (1)
- Hibernate QBC (1)
- oracle oracle10g (1)
- RBAC 权限设计 (1)
- springsecurity 3 (1)
- JPA (1)
- JPA j2ee (1)
- maven java (1)
- Jquery框架 UI框架 (1)
- printcss (1)
- java reflect 反射 (1)
- Jquery框架 UI框架 3scschool (1)
- collabnet Subversion (1)
- linux redhat (1)
- mysql (3)
- spring spring-data-jpa (1)
- Jquery AjaxForm (1)
- Jquery Map (1)
- linux (3)
- linux nginx openssl zlib pcre (1)
- linux jdk (1)
- 物联网技术 嵌入式 C# (1)
- oracle 数据库 (1)
- oracle (5)
- maven (1)
- java 定时器 (1)
- swing (1)
- java (2)
- 短信接口 (1)
- DBUtils (1)
- JDBC (1)
- javascript json (1)
- shiro (1)
- 权限系统 (1)
- 嵌入式 (1)
- 树莓派 (1)
- python (1)
- Github (1)
- 代码托管 (1)
- 产品设计 (2)
- 产品需求 (2)
- BRD (1)
- MRD (1)
- PRD (1)
- DRD (1)
- FRD (1)
- GIS (1)
- SOA (1)
- 网站资源 (1)
- 骆驼 (1)
- 黑客技术资源 (1)
- 网络安全资源 (1)
- 个人修炼 (1)
- Angular2 (1)
- Nodejs Krakenjs (1)
最新评论
-
GeorgeFeng:
学习啦,感谢
RBAC用户权限管理数据库设计 -
徜徉の小溪:
yuanliangding 写道请求进来时,创建的对象都不是由 ...
基于RESTful Web Service 的Jersey框架与Spring完美整合 -
yuanliangding:
请求进来时,创建的对象都不是由Spring弄出来的。。
基于RESTful Web Service 的Jersey框架与Spring完美整合 -
Ripin_Yan:
我已经按照你的xml这个顺序配置了,结果还是中文乱码。是还有什 ...
SpringMVC使用注解@ResponseBody返回json中文乱码 -
王静娜:
作者的实体图画的很好很有条理,但是个人觉得用户组对应的是资源, ...
RBAC用户权限管理数据库设计
本篇文章是对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 值等。比如 UsernamePasswordCredentials ,封装的是用户名和密码。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 认证类图
发表评论
-
开源项目 企业框架,学习资料
2013-05-13 16:10 1578Spring mvc+hibernate+freemar ... -
maven 通用配置
2013-04-27 10:02 3019在搭建maven 项目的时候,我们很 ... -
SpringMVC使用注解@ResponseBody返回json中文乱码
2012-11-27 14:42 12492----------------------------- ... -
EL表达式 functions String处理函数
2012-03-27 14:56 425701.uri="http://java.sun.co ... -
Hibernate hbm.xml中查询数据作为虚拟列Formula使用
2011-12-26 17:09 6258Hibernate 中的Formula 攻 ... -
Dom4jUtils 工具类让你更加方便操作XML的MarkerIce.Jar
2011-09-29 11:24 1652最近我闲着无聊,看到一篇文章关于XMl的操作.对于XMl操作相 ... -
getHibernateTemplate.load() 和get()之间的区别
2011-09-08 15:19 8751今天我在hibernate 进行 getHibernateTe ... -
排序算法java版,速度排行:冒泡排序、简单选择排序、直接插入排序、折半插入排序、希尔排序、堆排序、归并排序、快速排序
2011-05-24 09:16 1631先推荐一篇关于排序算法的文章:http://www.cpp ... -
struts2整合JSON,JQuery 实现ajax功能
2011-05-17 10:23 24524月 我使用到了 struts2 整合JQuer ... -
在spring来管理实例对象prototype和singleton的选择.针对action如何使用
2011-04-22 15:54 1376默认情况下,从bean工厂所取得的实例为Singleton(b ... -
Apache Commons工具集简介
2011-03-22 14:33 1278Apache Commons包含了很多开源的工具,用于解 ... -
java使用定时器,定时发送邮件
2011-02-22 16:01 1698java使用定时器,定时发送邮件 ... -
JSP 分页标签库
2010-12-31 16:11 3055好了,该说一下怎么用 ... -
struts2类型转换机制
2010-12-31 14:17 1655struts2类型转换机制 package com. ... -
java中web.xml的配置信息
2010-11-18 09:49 3772<?xml version="1.0&q ... -
forward,include,redirect的区别(转)
2010-08-27 13:54 1359forward,include,redirect是 ... -
一个Java程序员应该掌握的10项技能[转]
2010-06-12 10:53 13051、语法:必须比较 ... -
(转)Java开发者的十大戒律
2010-06-09 17:27 1200有许多标准和实 ... -
Java 线程同步示例
2010-06-08 23:22 1408文章用实例代码展示了Java中多线程访问共享资源 时线程同 ... -
synchronized 关键字
2010-05-28 10:28 1204synchronized 关键 ...
相关推荐
在这个"CAS-Server-Client单点登录demo"中,我们将深入探讨CAS服务器与客户端的整合以及如何在Apache Tomcat上进行测试。 首先,CAS服务器是整个SSO机制的核心,它负责处理用户的认证请求和验证用户的身份。在"cas-...
CAS(Central Authentication Service)是Java开发的一个开源单点登录(Single Sign-On,简称SSO)框架,主要用于解决多应用系统中的用户身份验证问题。在单点登录系统中,用户只需要登录一次,就可以访问所有相互...
在本“CAS单点登录demo”中,我们将深入探讨CAS的工作原理、配置步骤以及如何实现客户端与服务器端的交互。 1. CAS工作原理: CAS的核心思想是集中式的身份验证,用户只需在一个地方进行登录,之后访问其他已经...
CAS单点登录操作文档 CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目。CAS 具有以下特点: • 开源的企业级单点登录解决...
Spring Boot 整合 CAS Client 实现单点登录验证的示例 Spring Boot 整合 CAS Client 是一种流行的解决方案,用于实现单点登录(Single Sign-On,简称 SSO)。在多个应用系统中,用户只需要登录一次就可以访问所有...
资源列表(1:cas CAS Server,2:Cas_Client_One 授权系统,3:graduationDesign 用户组织管理系统,4:CAS单点登录论文.doc,5:CAS单点登录文献综述.doc,6:基于CAS的用户管理单点登录门户系统ppt.ppt)
CAS(Central Authentication Service)是Java开发的一个开源的单点登录(Single Sign-On,简称SSO)框架,主要用于解决网络应用中的身份验证问题。本压缩包提供了CAS服务端自定义认证的实现,以及CAS客户端的配置...
SSO(Single Sign-On)是单点登录的缩写,是一种网络用户身份验证的机制,允许用户在一次登录后访问多个应用系统而无需再次验证。CAS(Central Authentication Service)是SSO的一种实现,由耶鲁大学开发并开源,它...
单点登录(Single Sign On , 简称 SSO )是目前比较流行的服务于企业业务整合的解决...CAS Client 支持非常多的客户端(这里指单点登录系统中的各个 Web 应用),包括 Java, .Net, PHP, Perl, Apache, uPortal, Ruby 等。
本文在已有的禅道集成CAS单点登录的客户端插件基础上进行的修改,因原有插件在我们的系统上调试无法成功,做了一些定制,环境如下: 1. CAS server 版本:4.0.0 2. 禅道开源版本: 9.6.3 3. 禅道CAS client 插件版本...
CAS多数据库配置单点登录 CAS(Central Authentication Service)是一种流行的单点登录解决方案,能够提供安全、...通过了解CAS单点登录的原理和配置步骤,可以更好地应用CAS单点登录,提高企业应用的安全性和可靠性。
通过以上详细步骤,你可以成功配置并实现基于CAS的SSO单点登录系统。在配置过程中,可能会遇到各种问题,如网络连接、证书验证、配置错误等,解决这些问题后,即可享受到SSO带来的便捷性。如果有任何疑问,可以查阅...
### CAS单点登录系统知识点详解 #### 一、CAS简介 CAS(Central Authentication Service)是由耶鲁大学发起的一项开源项目,其目标在于为Web应用提供可靠且统一的单点登录解决方案。自2004年12月起,CAS成为了JA-...
### 使用 CAS 实现 Mantis 单点登录与登出 #### 概述 单点登录(Single Sign-On,简称 SSO)是一种常见的身份认证模式,它允许用户在多个应用程序和服务中仅通过一次登录就能访问所有相关系统而无需多次输入密码。...
使用struts2+spring+cas实现的单点登录功能,里面包括cas-server3.5.2项目一个,cas-client3.2.1 web项目两个,数据库脚本,请按照里面的说明文档进行部署,希望你们也能配置成功。
3 CAS单点登录简介(针对实践选择的技术) 5 3.1 技术快速使用说明 5 3.1.1 设置服务器域名 5 3.1.2 生成证书(这里采用JDK自带的工具keytool) 5 3.1.3 为客户端JVM导入证书 6 3.1.4 将证书应用到Web服务器Tomcat 7...
CAS(Central Authentication Service)是 Yale 大学开源的一个基于 Java 的单点登录系统,它提供了一种安全、便捷的身份验证机制。本文档将深入探讨如何使用 CAS 实现 Java 应用中的单点登录功能。 一、CAS 概述 ...
在这个"cas单点登录官方demo"中,我们可以深入理解CAS的工作原理和实现方法。 首先,单点登录的核心概念是“一次登录,全局通行”。用户在进入系统时只需要验证一次身份,之后在访问其他关联应用时,系统会自动识别...