关于cas

Posted on

关于cas-server-webapp for ldap的principal其他属性返回的问题 - 贝贝爸爸的程序人生 - BlogJava

贝贝爸爸的程序人生

关注Seam、BPM

posts - 23, comments - 6, trackbacks - 0, articles - 32 BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合 :: 管理

日历

<2012年4月>日一二三四五六2526272829303112345678910111213141516171819202122232425262728293012345

常用链接

留言簿(1)

随笔分类(19)

随笔档案(40)

文章分类(17)

文章档案(12)

收藏夹(25)

常用链接

搜索

最新评论

阅读排行榜

评论排行榜

Posted on 2012-04-25 23:12 贝贝爸爸 阅读(44) 评论(0) 编辑 收藏 所属分类: CAS

nnd,今天搞了快2个小时,总是无法解决ldap支持的其他属性返回问题,因为之前配置的是3.3.5版本,现在最新的版本是3.4.11,原来的配置竟然无法使用了,原来是因为增加服务:

导致无法返回principal的其他属性到客户端,其实象这样配置即可:

……………… 如上所示,其中注册的服务registeredServices 默认是不允许返回其他属性到客户端的!!!!!,真的是很坑爹啊,不过,配置一下ignoreAttributes即可,也可以指定allowedAttributes 如下:

新用户注册 刷新评论列表

博问 - 解决您的IT难题 博客园 博问 IT新闻 Java程序员招聘 标题 请输入标题 姓名 请输入你的姓名 主页 请输入验证码 验证码 /* 内容(请不要发表任何与政治相关的内容) 请输入评论内容 Remember Me? 登录 [使用Ctrl+Enter键可以直接提交] IT新闻: · 指尖上的体验:从可折叠iPhone物理键盘Spike说起 · 解密腾讯星云 · 图书出版业如何应对数字盗版 · 资本局中局:成也萧何败也萧何 · 微软本周发布9个补丁 影响所有Windows/Office

博客园首页随笔: · 设计模式学习笔记-适配器模式 · [原创]一起来做网页游戏---第一章 巧妇难为无米之炊 · Spring3开发实战 之 第二章:IoC/DI开发(1) · 第七话 Asp.Net Mvc 3.0【MVC项目实战の三】 · GNU C - Using GNU GCC attribute mechanism 01 知识库: · Web前端:11个让你代码整洁的原则 · 页面前端的水有多深?再议页面开发 · Fiddler 教程 · 关于编程学习的七点思索 · 一地鸡毛 — 软件项目中的人际困局 网站导航:

博客园 IT新闻 知识库 C++博客 程序员招聘 管理 Powered by: BlogJava Copyright © 贝贝爸爸

cas配置全攻略

Posted on

cas配置全攻略 - 哈哈,吼吼,这是个好地方 - BlogJava

哈哈,吼吼,这是个好地方 没有风雨躲的过, 没有坎坷不必走……

BlogJava 首页 新随笔 联系 聚合 管理

posts - 37, comments - 50, trackbacks - 0

cas配置全攻略

经过将近两天的测试,参考众多网友的贡献,终于完成了对cas的主要配置和测试,现记录如下

基本需求:

1.cas server-3.4.5,casclient-3.2(官方版本),均可在cas官方网站下载,http://www.jasig.org

2.使用低成本的http协议进行传输,俺买不起ssl证书

3.通过jdbc进行用户验证

4.需要通过casserver提供除登录用户名以外的附加信息

参考资料:

1.cas官方网站的用户帮助手册和wiki

2.网友“城市猎人”的blog,http://yuzhwe.javaeye.com/blog/830143

3.网友“悟空悟道”的blog,http://llhdf.javaeye.com/blog/764385

4.其他网友贡献的相关的blog,都是通过google出来,就不一一列出了,一并致谢!!!

好了,下面进入正题,如果您不想测试中出现异常情况,或是获取不到相关数据,请关注文中的红色字体部分。

(1)使用http协议的设置,如果您也像我一样,买不起ssl数字证书,对安全的要求也不是特别的搞,下面的配置就可以帮助解决这个问题:

在cas-server-webapp中的/WEB-INF/spring-configuration/ticketGrantingTicketCookieGenerator.xml文件中有如下配置

(2)使用jdbc数据源进行用户认证,需要修改cas的authenticationHandlers方式,在文件/WEB-INF/deployerConfigContext.xml有如下配置: //用户密码编码方式
该属性中的list只要用一个认证通过即可,建议将红色部分放在第一位,如果确认只用jdbc一种方式,其他认证方式均可删除。另外需要在在文件中添加datasoure和passordEncoder两个bean,如下 com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8 //如果使用mysql数据库,应该加上后面的编码参数,否则可能导致客户端对TGT票据无法识别的问题 root password //cas server默认支持MD5和SHA1两种编码方式,如果需要其他的编码方式例如SHA256,512等,可自行实现org.jasig.cas.authentication.handler.PasswordEncoder接口

附加备注:如果您是使用cas server的源码自行编译的话,需要在cas-server-web模块的pom.xml中添加如下模块的依赖:

${project.groupId} cas-server-support-jdbc ${project.version}

并添加对应数据库的jdbc的jar包。

(3)让cas server提供更多的用户数据共客户端使用

通过测试,由于cas的代码更新过程中的变化较大,所以包兼容的问题好像一直存在,在测试中我就碰到过,花费时间比较多,建议同学们在使用过程中使用官方的最新的发布版本。在我使用的这个版本中,请参考前面的关于server和client端的版本说明,应该没有包冲突的问题,测试通过。下面进行配置,配置文件:/WEB-INF/deployerConfigContext.xml

//为认证过的用户的Principal添加属性 修改该文件中默认的 attributeRepositorybean配置 //key为对应的数据库字段名称,value为提供给客户端获取的属性名字,系统会自动填充值
备注:网上有很多的关于这个的配置,但是如果您使用的是我提供的版本或是高于这个版本,就应该象上面这样配置,无用质疑,网上大部分的配置都是基于 person-directory-impl,person-directory-api 1.1左右的版本,而最新的cas使用的是1.5的版本,经过查看源代码和api docs确定最新版本的属性参数如上配置。

修改该xml文件中最后一个默认的serviceRegistryDao bean中的属性全部注释掉,或者删除, 这个bean中的RegisteredServiceImpl的ignoreAttributes属性将决定是否添加attributes属性内容,默认为false:不添加,只有去掉这个配置, cas server才会将获取的用户的附加属性添加到认证用的Principal的attributes中去,我在这里犯过这样的错误,最后还是通过跟踪源码才发现的。

<!--
                <bean class="org.jasig.cas.services.RegisteredServiceImpl">
                    <property name="id" value="1" />
                    <property name="name" value="HTTPS" />
                    <property name="description" value="Only Allows HTTPS Urls" />
                    <property name="serviceId" value="https:///*/*" />
                </bean>

                <bean class="org.jasig.cas.services.RegisteredServiceImpl">
                    <property name="id" value="2" />
                    <property name="name" value="IMAPS" />
                    <property name="description" value="Only Allows HTTPS Urls" />
                    <property name="serviceId" value="imaps:///*/*" />
                </bean>

                <bean class="org.jasig.cas.services.RegisteredServiceImpl">
                    <property name="id" value="3" />
                    <property name="name" value="IMAP" />
                    <property name="description" value="Only Allows IMAP Urls" />
                    <property name="serviceId" value="imap:///*/*" />
                </bean>
            </list>
        </property>-->
       </bean>

修改WEB-INF\view\jsp\protocol\2.0\casServiceValidationSuccess.jsp文件,如下:

<%@ page session="false"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>

${fn:escapeXml(assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.id)} ${pgtIou} ${fn:escapeXml(proxy.principal.id)} ${fn:escapeXml(attr.value)} 客户端配置: 1.过滤器CAS Validation Filter:

CAS Validation Filter org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter casServerUrlPrefix http://domainserver:8081/cas 在客户端获取信息 AttributePrincipal principal = (AttributePrincipal) request.getUserPrincipal(); String loginName = principal.getName();//获取用户名 Map attributes = principal.getAttributes(); if(attributes != null) { System.out.println(attributes.get("userId")); System.out.println(attributes.get("passwordHint")); }

posted on 2011-01-21 10:06 雪地孤鸿 阅读(3704) 评论(7) 编辑 收藏 所属分类: java

FeedBack:

/# re: cas配置全攻略

2011-01-23 13:13 | 来如风 非常好,我上周也配置成功 只是最后过滤器有疑问

casServerUrlPrefix

http://domainserver:8081/cas 我是集成了spring security 的配置,貌似这些不在过滤其中配置,在bean文件中有 回复 更多评论 /# re: cas配置全攻略

2011-01-24 16:29 | coolszy 你好,按照你的配置,但是 Map attributes = principal.getAttributes(); 还是得到空值,不知道什么原因 回复 更多评论

/# re: cas配置全攻略[未登录]

2011-02-07 11:02 | mcikeay

cas 会自己组装节点中的key-value, 节点间默认是 and 连接 回复 更多评论 /# re: cas配置全攻略

2011-02-14 15:15 | tufanshu @coolszy 请检查cas client的版本是否正确 回复 更多评论

/# re: cas配置全攻略

2011-03-29 10:45 | wuximin 通过ldap验证,改怎样修改呢 回复 更多评论 /# re: cas配置全攻略

2011-06-05 18:19 | artd 按您的要求,为何还是不行呀,不知道那里出问题了。 不过我用的server是3.3.5.1 用3.4.5也不行,有空交流一下哟。 以下是log信息 2011-06-05 18:09:19,515 DEBUG [org.jasig.cas.authentication.principal.UsernamePasswordCredentialsToPrincipalResolver] - Attempting to resolve a principal... 2011-06-05 18:09:19,515 DEBUG [org.jasig.cas.authentication.principal.UsernamePasswordCredentialsToPrincipalResolver] - Creating SimplePrincipal for [test] 2011-06-05 18:09:20,421 DEBUG [org.jasig.services.persondir.support.jdbc.SingleRowJdbcPersonAttributeDao] - Created seed map='{username=[test]}' for uid='test' 2011-06-05 18:09:20,421 DEBUG [org.jasig.services.persondir.support.jdbc.SingleRowJdbcPersonAttributeDao] - Adding attribute 'username' with value '[test]' to query builder 'null' 2011-06-05 18:09:20,421 DEBUG [org.jasig.services.persondir.support.jdbc.SingleRowJdbcPersonAttributeDao] - Generated query builder 'sql=[username = ?] args=[test]' from query Map {username=[test]}. 2011-06-05 18:09:20,546 DEBUG [org.jasig.services.persondir.support.jdbc.SingleRowJdbcPersonAttributeDao] - Executed 'select id,username,password,email,score from user where username = ?' with arguments [test] and got results [{id=20428, username=test, password=1a16128849444873, email=et@163.com, score=6}] 2011-06-05 18:09:20,562 INFO [org.jasig.cas.CentralAuthenticationServiceImpl] - Granted service ticket [ST-1-cp3cb14yiqbqnYfg7C1f-cas] for service [http://d7.abc.com/simple.php] for user [test] 2011-06-05 18:09:20,640 DEBUG [org.springframework.web.servlet.view.RedirectView] - Rendering view with name 'null' with model null and static attributes {} 2011-06-05 18:09:20,703 DEBUG [org.springframework.web.servlet.view.ResourceBundleViewResolver] - Cached view [casServiceSuccessView_zh_CN] 2011-06-05 18:09:20,703 DEBUG [org.springframework.web.servlet.view.JstlView] - Rendering view with name 'casServiceSuccessView' with model {assertion=[principals={[[Principal=test, attributes={authenticationMethod=com.jute.framework.jdbc.QueryDatabaseAuthenticationHandler}]]} for service=http://d7.abc.com/simple.php]} and static attributes {} 2011-06-05 18:09:20,750 DEBUG [org.springframework.web.servlet.view.JstlView] - Added model object 'assertion' of type [org.jasig.cas.validation.ImmutableAssertionImpl] to request in view with name 'casServiceSuccessView' 2011-06-05 18:09:20,750 DEBUG [org.springframework.web.servlet.view.JstlView] - Forwarding to resource [/WEB-INF/view/jsp/protocol/2.0/casServiceValidationSuccess.jsp] in InternalResourceView 'casServiceSuccessView' 回复 更多评论

/# re: cas配置全攻略

2011-10-19 15:24 | fanfree 同样遇到 Map是空的,没有附加属性 回复 更多评论 新用户注册 刷新评论列表

博问 - 解决您的IT难题 博客园 博问 IT新闻 Java程序员招聘 标题 请输入标题 姓名 请输入你的姓名 主页 请输入验证码 验证码 /* 内容(请不要发表任何与政治相关的内容) 请输入评论内容 Remember Me? 登录 [使用Ctrl+Enter键可以直接提交] IT新闻: · 苹果在移动支付领域之慢,是福是祸? · 黑莓应用商店应用下载量突破30亿次,应用数量达9万款 · 微软将推出Bing天使基金孵化器 · 苹果在华测试iPad mini:微胖 具备通话功能 · 抱上微软粗腿不怕!诺基亚豪言明年定走出困境

博客园首页随笔: · MVC3使用Unity实现依赖注入接口与于实现类自动注册 · k-means clustering K平均算法 · 【hdu - 1061 Rightmost Digit】 · SqlServer 对 数据类型 text 的操作 · Step By Step(Lua弱引用table) 知识库: · 页面前端的水有多深?再议页面开发 · Fiddler 教程 · 关于编程学习的七点思索 · 一地鸡毛 — 软件项目中的人际困局 · 互联网——降级论 网站导航:

博客园 IT新闻 知识库 C++博客 程序员招聘 管理 相关文章:

常用链接

留言簿(13)

随笔分类

随笔档案

文章档案

blog

搜索

*

最新评论

阅读排行榜

评论排行榜

cas改造随笔

Posted on

cas改造随笔 - horus - 博客园

hello wood 博客园 首页 社区 新随笔 联系 订阅订阅 管理

随笔-9 评论-5 文章-1 trackbacks-0

cas改造随笔

Sso doc

关键字:

sso域名:cas.server.com

登陆地址(spring web flow):https://cas.800jit.com/cas/login

登陆地址(直接):https://cas.800jit.com/cas/directLogin

退出地址:https://cas.800jit.com/cas/logout

语言参数:locale=zh_CN,locale=en

环境篇

一、所需软件

Jdk:jdk1.6.0_13

Apache:httpd-2.2.15-win32-x86-openssl-0.9.8m-r2

Tomcat:apache-tomcat-6.0.10

jks2pfx:证书导出工具http://www.myssl.cn/download/jks2pfx.zip

memcache:memcached-1.2.1-win32(需要memcache集群环境)

二、安全证书生成

1、keytool

Apache、tomcat、jdk需要使用安全证书,进windows command窗口生成证书,命令如下:

--生成证书库

keytool -genkey -alias 800jit -keyalg RSA -keystore d:/cert/800jitkey

--从证书库中到处证书

keytool -export -file d:/cert/800jit.crt -alias 800jit -keystore d:/cert/800jitkey

--把证书导入jdk的证书库

keytool -import -keystore d: /jdk1.6.0_13/jre/lib/security/cacerts -file d:/cert/800jit.crt -alias 800jit

--生成Apache服务器的SSL连接需要配置私钥文件和证书文件

D:\casex\jks2pfx>JKS2PFX.bat .keystore 800jitkey tomcat server_dev00

生成的server_dev00.crt,server_dev00.key放到D:/work/Apache2.2/conf/

2**、openssl**

openssl req -config ..\conf\openssl.cnf -new -out olymtech.csr

openssl rsa -in privkey.pem -out olymtech.key

openssl x509 -in olymtech.csr -out olymtech.cert -req -signkey olymtech.key -days 3650

openssl x509 -in olymtech.cert -out olymtech.der.crt -outform DER

keytool -import -keystore d:/work/jdk1.6.0_13/jre/lib/security/cacerts -file d:/casex/ssl/olymtech.crt -alias olymtech

keytool -import -keystore D:/casex/800jitkey -file D:/casex/cas-doc/ssl/olymtech.crt -alias olymtech

三、Apache配置

Apache+ssl+虚拟机

--修改http.conf文件

取消注释 LoadModule ssl_module modules/mod_ssl.so

取消注释 Include conf/extra/httpd-ssl.conf

取消注释 Include conf/extra/httpd-vhosts.conf

ProxyPass /cas balancer://cas lbmethod=bytraffic stickysession=jsessionid

BalancerMember ajp://192.168.1.190:10009/cas loadfactor=1 route=jvm1 BalancerMember ajp://192.168.1.190:8009/cas loadfactor=1 route=jvm2

--修改httpd-ssl.conf

下增加

ProxyPass /cas balancer://cas/ lbmethod=bytraffic stickysession=jsessionid

ProxyPassReverse /cas balancer://cas/

SSLProxyEngine On

修改

SSLCertificateFile "D:/work/Apache2.2/conf/server_dev00.crt"

SSLCertificateKeyFile "D:/work/Apache2.2/conf/server_dev00.key"

--修改httpd-vhosts.conf

下增加

ProxyPass /cas balancer://cas/ lbmethod=bytraffic stickysession=jsessionid

ProxyPassReverse /cas balancer://cas/

四、Tomcat配置

修改server.xml

--配置ssl

五、session共享(Tomcat)

六、memcache集群

CAS SERVER篇

一、CAS 原理介绍

访问流程图

主要原理:用户第一次访问一个CAS 服务的客户web 应用时(访问URL :http://192.168.1.90:8081/web1 ),部署在客户web 应用的cas AuthenticationFilter ,会截获此请求,生成service 参数,然后redirect 到CAS 服务的login 接口,url为https://cas:8443/cas/login?service=http%3A%2F%2F192.168.1.90%3A8081%2Fweb1%2F ,认证成功后,CAS 服务器会生成认证cookie ,写入浏览器,同时将cookie 缓存到服务器本地,CAS 服务器还会根据service 参数生成ticket,ticket 会保存到服务器,也会加在url 后面,然后将请求redirect 回客户web 应用,url 为http://192.168.1.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 服务端的处理逻辑

CAS 服务端总共对外定义了9 个接口,客户端通过访问这9 个接口与服务端交互,这9个接口为: 接口

说明

备注 /login

认证接口

/logout

退出接口,负责销毁认证cookie

/validate

验证ticket 用的接口,CAS1.0 定义

/serviceValidate

验证ticket 用的接口,CAS2.0 定义,返回xml 格式的数据

/proxy

支持代理认证功能的接口

/proxyValidate

支持代理认证功能的接口

/CentralAuthenticationService

用于和远程的web services 交互

/remoteLogin(新增)

认证接口

/directLogin(新增)

认证接口

详细说明:

/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 完成认证逻辑。**

序列图

类图

四、Ticket介绍

CAS的核心就是其Ticket,及其在Ticket之上的一系列处理操作。CAS的主要票据有TGT、ST、PGT、PGTIOU、PT,其中TGT、ST是CAS1.0协议中就有的票据,PGT、PGTIOU、PT是CAS2.0协议中有的票据。

一 名词解释

  • TGT(Ticket Grangting Ticket)

TGT是CAS为用户签发的登录票据,拥有了TGT,用户就可以证明自己在CAS成功登录过。TGT封装了Cookie值以及此Cookie值对应的用户信息。用户在CAS认证成功后,CAS生成cookie,写入浏览器,同时生成一个TGT对象,放入自己的缓存,TGT对象的ID就是cookie的值。当HTTP再次请求到来时,如果传过来的有CAS生成的cookie,则CAS以此cookie值为key查询缓存中有无TGT ,如果有的话,则说明用户之前登录过,如果没有,则用户需要重新登录。

  • ST(Service Ticket)

ST是CAS为用户签发的访问某一service的票据。用户访问service时,service发现用户没有ST,则要求用户去CAS获取ST。用户向CAS发出获取ST的请求,如果用户的请求中包含cookie,则CAS会以此cookie值为key查询缓存中有无TGT,如果存在TGT,则用此TGT签发一个ST,返回给用户。用户凭借ST去访问service,service拿ST去CAS验证,验证通过后,允许用户访问资源。

  • PGT(Proxy Granting Ticket)

Proxy Service的代理凭据。用户通过CAS成功登录某一Proxy Service后,CAS生成一个PGT对象,缓存在CAS本地,同时将PGT的值(一个UUID字符串)回传给Proxy Service,并保存在Proxy Service里。Proxy Service拿到PGT后,就可以为Target Service(back-end service)做代理,为其申请PT。

  • PGTIOU(Proxy Granting Ticket IOU)

PGTIOU是CAS协议中定义的一种附加票据,它增强了传输、获取PGT的安全性。 PGT的传输与获取的过程:Proxy Service调用CAS的serviceValidate接口验证ST成功后,CAS首先会访问pgtUrl指向的https url,将生成的 PGT及PGTIOU传输给proxy service,proxy service会以PGTIOU为key,PGT为value,将其存储在Map中;然后CAS会生成验证ST成功的xml消息,返回给Proxy Service,xml消息中含有PGTIOU,proxy service收到Xml消息后,会从中解析出PGTIOU的值,然后以其为key,在map中找出PGT的值,赋值给代表用户信息的Assertion对象的pgtId,同时在map中将其删除。

  • PT(Proxy Ticket)

PT是用户访问Target Service(back-end service)的票据。如果用户访问的是一个Web应用,则Web应用会要求浏览器提供ST,浏览器就会用cookie去CAS获取一个ST,然后就可以访问这个Web应用了。如果用户访问的不是一个Web应用,而是一个C/S结构的应用,因为C/S结构的应用得不到cookie,所以用户不能自己去CAS获取ST,而是通过访问proxy service的接口,凭借proxy service的PGT去获取一个PT,然后才能访问到此应用。

二 代码解析

CAS Ticket类图

  • TicketGrantingTicket 的 grantServiceTicket方法

方法声明:public synchronized ServiceTicket grantServiceTicket(final String id,final Service service, final ExpirationPolicy expirationPolicy, final boolean credentialsProvided)

方法描述:

1:生成SerivceTicketImpl

2:更新属性:

this.previousLastTimeUsed = this.lastTimeUsed;

this.lastTimeUsed = System.currentTimeMillis();

this.countOfUses++;

3:给service对象的principal属性赋值

4:将service对象放入map services

  • ServiceTicket 的 grantTicketGrantingTicket方法

方法声明:

public TicketGrantingTicket grantTicketGrantingTicket(final String id, final Authentication authentication,final ExpirationPolicy expirationPolicy)

方法描述:在CAS3.3对CAS2.0协议的实现中,PGT是由ST签发的,调用的就是ServiceTicket的grantTicketGrantingTicket方法。方法返回的TicketGrantingTicket对象,表征的是一个PGT对象,其中的ticketGrantingTicket属性的值是签发ST的TGT对象。

  • TicketGrantingTicket 的 expire方法

方法声明:void expire()

方法描述:

在CAS的logout接口实现中,要调用TGT对象的expire方法,然后会在缓存中清除此TGT对象。

expire方法的内容:循环遍历 services 中的Service对象,调用其logoutOfService方法。具体Service实现类中的logoutOfService方法的实现,要通知具体的应用,客户要退出。

三、TGT、ST、PGT、PT关系

1:ST是TGT签发的。用户在CAS上认证成功后,CAS生成TGT,用TGT签发一个ST,ST的ticketGrantingTicket属性值是TGT对象,然后把ST的值redirect到客户应用。

2:PGT是ST签发的。用户凭借ST去访问Proxy service,Proxy service去CAS验证ST(同时传递PgtUrl参数给CAS),如果ST验证成功,则CAS用ST签发一个PGT,PGT对象里的ticketGrantingTicket是签发ST的TGT对象。

3:PT是PGT签发的。Proxy service代理back-end service去CAS获取PT的时候,CAS根据传来的pgt参数,获取到PGT对象,然后调用其grantServiceTicket方法,生成一个PT对象。

TGT、ST、PGT、PT之间的关联关系

CAS CLIENT篇

CASFilter 参数说明:

参数

是否必须

说明 com.olymtech.cas.client.filter.loginUrl

指定 CAS 提供登录页面的 URL com.olymtech.cas.client.filter.validateUrl

指定 CAS 提供 service ticket 或 proxy ticket 验证服务的 URL com.olymtech.cas.client.filter.serverName

指定客户端的域名和端口,是指客户端应用所在机器而不是 CAS Server 所在机器,该参数或 serviceUrl 至少有一个必须指定 com.olymtech.cas.client.filter.serviceUrl

该参数指定过后将覆盖 serverName 参数,成为登录成功过后重定向的目的地址 com.olymtech.cas.client.filter.wrapRequest

如果指定为 true,那么 CASFilter 将重新包装 HttpRequest,并且使 getRemoteUser() 方法返回当前登录用户的用户名 com.olymtech.cas.client.filter.noFilter

设置不过滤的路径,语法如下:/name1/,/name2, com.olymtech.cas.client.filter.proxyCallbackUrl

用于当前应用需要作为其他服务的代理(proxy)时获取 Proxy Granting Ticket 的地址 com.olymtech.cas.client.filter.authorizedProxy

用于允许当前应用从代理处获取 proxy tickets,该参数接受以空格分隔开的多个 proxy URLs,但实际使用只需要一个成功即可。当指定该参数过后,需要修改 validateUrl 到 proxyValidate,而不再是 serviceValidate com.olymtech.cas.client.filter.renew

如果指定为 true,那么受保护的资源每次被访问时均要求用户重新进行验证,而不管之前是否已经通过 com.olymtech.cas.client.filter.gateway

指定 gateway 属性

应用整合篇

一、JAVA程序整合

1、**应用配置说明(结合cas client**)

导入key到本地jdk(tomcat使用的jdk必须)

keytool -import -keystore d:/work/jdk1.6.0_13/jre/lib/security/cacerts -file d:/casex/800jit.crt -alias 800jit

在ie中导入证书800jit.crt

修改web程序的web.xml添加

<!-- 用于单点退出 -->

<listener>

    <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>

</listener>



<filter>

<filter-name>CAS Single Sign Out Filter</filter-name>

<filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>

</filter>



<!-- 用于单点登录 -->



<filter>

   <filter-name>CAS Filter</filter-name>

   <filter-class>com.olymtech.cas.client.filter.CASFilter</filter-class>

   <init-param>

       <param-name>com.olymtech.cas.client.filter.loginUrl</param-name>

       <param-value>https://cas.server.com/cas/login</param-value>

   </init-param>

   <init-param>

       <param-name>com.olymtech.cas.client.filter.validateUrl</param-name>

       <param-value>https://cas.server.com/cas/serviceValidate</param-value>

   </init-param>

   <init-param>

       <param-name>com.olymtech.cas.client.filter.serverName</param-name>

       <param-value>saas.server.com</param-value>

   </init-param>

   <init-param>

       <param-name>com.olymtech.cas.client.filter.wrapRequest</param-name>

       <param-value>true</param-value>

   </init-param>

</filter>



<filter-mapping>

   <filter-name>CAS Single Sign Out Filter</filter-name>

   <url-pattern>//*</url-pattern>

</filter-mapping>



<filter-mapping>

   <filter-name>CAS Filter</filter-name>

   <url-pattern>//*</url-pattern>

</filter-mapping>

在jsp/servlet中得到登陆数据:

<%@ page language="java" import="com.olymtech.cas.client.filter.CASFilterRequestWrapper"%>

<%

CASFilterRequestWrapper reqWrapper=new CASFilterRequestWrapper(request);

String username = reqWrapper.getRemoteUser();

%>

二、.NET程序整合

附件

ssl.rar(证书)

http.conf(apache配置文件)

httpd-ssl.conf(apache配置文件)

httpd-vhosts.conf(apache配置文件)

server.xml(tomcat配置文件)

AppSsoDemo-java.rar(java整合例子,包含所需jar包)

posted on 2010-08-05 17:23 horus 阅读(2394) 评论(2) 编辑 收藏

刷新评论刷新页面返回顶部

程序员问答社区,解决您的技术难题 博客园首页博问新闻闪存程序员招聘知识库 Powered by: 博客园 模板提供:沪江博客 Copyright ©2012 horus

cas client使用指南

Posted on

cas client使用指南 - 老老 - ITeye技术网站

首页 资讯 精华 论坛 问答 博客 专栏 群组 更多 ▼

招聘 搜索

您还未登录 ! 登录 注册

老老

cas client使用指南 **

博客分类:

2008-02-27 JA-SIG(CAS)学习笔记3 关键字: cas sso 统一身份认证 java ja-sig 技术背景知识: JA-SIG CAS服务环境搭建,请参考 :JA-SIG(CAS)学习笔记1 JA-SIG CAS业务架构介绍,请参考 :JA-SIG(CAS)学习笔记2 HTTPS所涉及的Java安全证书知识,请参考 :Java keytool 安全证书学习笔记 CAS技术框架 CAS Server 目前,我们使用的CAS Server 3.1.1的是基于Spring Framework编写的,因此在CAS服务器端的配置管理中,绝大多数是Spring式的Java Bean XML配置。CAS 的服务器提供了一套易于定制的用户认证器接口,用户可以根据自身企业的在线系统的认证方式,来定制自己的认证逻辑。不论是传统的用户名/密码方式,还是基于安全证书的方式;是基于关系数据库的存储,还是采用LDAP服务器,CAS Server给我们提供了这些常用的验证器模板代码,只要稍作修改,便可灵活使用了。 对于广大的中国企业用户而言,另一个需要定制的功能莫过于全中文、企业特色的用户身份认证页面了。CAS Server提供了两套系统界面,一套是默认的CAS英文标准页面,另一套则是专门提供给用户来定制修改的。(PS:老外们做事情就是人性化啊~~)那么对CAS Server端的后续学习,我们将围绕着身份认证模块定制和界面定制这两方面展开。 CAS Client 客户端我们使用的是CAS Client 2.1.1。虽然在官方网站上已出现了3.1.0版本的下载,但该版本地代码已经完全重写,使用的package和类名同2.1.1大相径庭了,最关键的是,该版本暂时没有对应的API说明文档。虽然咖啡我对程序版本怀有极大的“喜新厌旧”的心态,但安全起见,还是先2.1.1吧,相信3.1.0的文档耶鲁大学的大牛们已经在整理了,期待中…… CAS Client2.1.1.jar中的代码是相当精炼的,有兴趣的朋友建议阅读一下源码。Jar包中的代码分成三个大部分

  1. edu.yale.its.tp.cas.util 包,其中只有一个工具类 SecureURL.java 用来访问HTTPS URL
  2. edu.yale.its.tp.cas.proxy包,用来处理Proxy Authentication代理认证的3个类,其中ProxyTicketReceptor.java是 接收PGT回调的servlet,在下文中我们会提及。
  3. edu.yale.its.tp.cas.client包,其中包含了CAS Filter ,Tag Library等主要的认证客户端工具类,我们在后面会进行重点介绍。 针对CAS Client的学习,我们的重点将放在CAS Filter 和ProxyTicketReceptor 的配置以及在Java SE环境下,直接使用 ServiceTicketValidator进行Ticket认证实现上。 CAS服务器端应用 定制适合你的身份认证程序 通过前面的学习,我们了解了CAS具有一个良好而强大的SSO功能框架。接下来,我们要学习如何将实际企业应用中的身份认证同CAS进行整合。 简单的说,要将现有企业应用中的认证集成到CAS Server中,只要实现一个名为AuthenticationHandler的一个认证处理Java接口就行。以下是该接口的源代码: Java代码 public interface AuthenticationHandler {
    /// / 该方法决定一个受支持的credentials是否是可用的, / 如果可用,该方法返回true,则说明身份认证通过 // boolean authenticate(Credentials credentials) throws AuthenticationException;
    //
    / / 该方法决定一个credentials是否是当前的handle所支持的 // boolean supports(Credentials credentials);
    } public interface AuthenticationHandler { //
    / / 该方法决定一个受支持的credentials是否是可用的, / 如果可用,该方法返回true,则说明身份认证通过 // boolean authenticate(Credentials credentials) throws AuthenticationException; /// / 该方法决定一个credentials是否是当前的handle所支持的 // boolean supports(Credentials credentials); } 这里我们要说明一下Credentials这个CAS的概念。所谓Credentials是由外界提供给CAS来证明自身身份的信息,简单的如一个用户名/密码对就是一个Credentials,或者一个经过某种加密算法生成的密文证书也可以是一个Credentials。在程序的实现上,Credentials被声明为一个可序列化的接口,仅仅起着标识作用,源代码如下: Java代码 public interface Credentials extends Serializable {
    // marker interface contains no methods
    } public interface Credentials extends Serializable { // marker interface contains no methods } CAS的API中,已经为我们提供了一个最常用的实现UsernamePasswordCredentials 用户名/密码凭证,代码如下: Java代码 public class UsernamePasswordCredentials implements Credentials {
    /// Unique ID for serialization. // private static final long serialVersionUID = -8343864967200862794L;
    //
    / The username. // private String username;
    /// The password. /*/ private String password;
    public final String getPassword() {
    return this.password;
    }
    public final void setPassword(final String password) {
    this.password = password;
    }
    public final String getUsername() {
    return this.username;
    }
    public final void setUsername(final String userName) {
    this.username = userName;
    }
    public String toString() {
    return this.username;
    }
    public boolean equals(final Object obj) {
    if (obj == null || !obj.getClass().equals(this.getClass())) {
       return false;  
    
    }
    final UsernamePasswordCredentials c = (UsernamePasswordCredentials) obj;
    return this.username.equals(c.getUsername())
       && this.password.equals(c.getPassword());  
    
    }
    public int hashCode() {
    return this.username.hashCode() ^ this.password.hashCode();
    }
    } public class UsernamePasswordCredentials implements Credentials { /// Unique ID for serialization. // private static final long serialVersionUID = -8343864967200862794L; /// The username. // private String username; /// The password. /*/ private String password; public final String getPassword() { return this.password; } public final void setPassword(final String password) { this.password = password; } public final String getUsername() { return this.username; } public final void setUsername(final String userName) { this.username = userName; } public String toString() { return this.username; } public boolean equals(final Object obj) { if (obj == null || !obj.getClass().equals(this.getClass())) {
       return false;
    
    } final UsernamePasswordCredentials c = (UsernamePasswordCredentials) obj; return this.username.equals(c.getUsername())
       && this.password.equals(c.getPassword());
    
    } public int hashCode() { return this.username.hashCode() ^ this.password.hashCode(); } } 很简单不是吗?就是存储一个用户名和密码的java bean而已。 接下来,我们将一个Credentials传给一个AuthenticationHandler进行认证,首先调用boolean supports(Credentials credentials)方法察看当前传入的Credentials实例,AuthenticationHandler实例现是否支持它?如果支持,再调用boolean authenticate(Credentials credentials)方法进行认证。由于用户名/密码方式是最常用的认证方法,因此CAS为我们提供了一个现成的基于该方式的抽象认证处理类AbstractUsernamePasswordAuthenticationHandler。通常我们只需要继承该类,并实现其中的 authenticateUsernamePasswordInternal方法即可。下面我们给出一个Demo的实现类,它的校验逻辑很简单——仅校验用户名的字符长度是否与密码的相等(这里密码是一个表示长度的整数),如果相等则认为认证通过,请看代码: Java代码 public class UsernameLengthAuthnHandler
                  extends AbstractUsernamePasswordAuthenticationHandler {  
    
    protected boolean authenticateUsernamePasswordInternal( UsernamePasswordCredentials credentials) throws AuthenticationException {
    //
    /
    这里我们完全可以用自己的认证逻辑代替,比如将用户名/密码传入一个SQL语句
    / 向数据库验证是否有对应的用户账号,这不是我们最经常干的事么?
    /
    只需要将下面的程序替换掉就OK了!!So easy,so simple!
    /
    String username = credentials.getUsername();
    String password = credentials.getPassword();
    String correctPassword = Integer.toString(username.length());
    return correctPassword.equals(password);
    }
    } public class UsernameLengthAuthnHandler
                  extends AbstractUsernamePasswordAuthenticationHandler {
    
    protected boolean authenticateUsernamePasswordInternal( UsernamePasswordCredentials credentials) throws AuthenticationException { // / 这里我们完全可以用自己的认证逻辑代替,比如将用户名/密码传入一个SQL语句 / 向数据库验证是否有对应的用户账号,这不是我们最经常干的事么? / 只需要将下面的程序替换掉就OK了!!So easy,so simple! / String username = credentials.getUsername(); String password = credentials.getPassword(); String correctPassword = Integer.toString(username.length()); return correctPassword.equals(password); } } 介绍到这里,大家应该清楚如何定制自己的AuthenticationHandler类了吧!这里要附带说明的是,在CAS Server的扩展API中已经提供了大量常用认证形式的实现类,它们同CAS Server的war包一同分发: cas-server-support-generic-3.1.1.jar ——使用Map记录用户认证信息的实现 cas-server-support-jdbc-3.1.1.jar —— 基于Spring JDBC的数据库实现(我们常用的) cas-server-support-ldap-3.1.1.jar —— 基于LDAP的用户认证实现 更多其他形式的实现各位看官有兴趣的,可以一一阅读源码。 配置你的身份认证程序 完成了定制认证类的代码编写,接下来就是要让CAS Server来调用它了。在CAS的框架中,对程序的配置都是使用Spring Framework的xml文件,这对于熟悉Spring的程序员而言算驾轻就熟了。 配置文件位于应用部署目录的WEB-INF子目录下——deployerConfigContext.xml。在bean id=authenticationManager 的 authenticationHandlers属性中配置我们的AuthenticationHandlers: 引用 <?xml version="1.0" encoding="UTF-8"?> 。。。 。。。 <!—下面就是系统默认的验证器配置,你可以替换它,或者增加一个新的handler --> 。。。 。。。 我们发现authenticationHandlers属性是一个list,在这个list中可以配置多个AuthenticationHandlers。这些AuthenticationHandlers形成了一个验证器链,所有提交给CAS的Credentials信息将通过这个验证器链的链式过滤,只要这链中有一个验证器通过了对Credentials的验证,就认为这个Credentials是合法的。这样的设计使得我们可以很轻松的整合不同验证体系的已有应用到同一个CAS上,比如:A验证器负责校验alpha系统提交的Credentials,它是基于LDAP服务器的;B验证器负责校验beta系统提交的Credentials,它是一个传统的RDB用户表认证;C验证器负责校验gamma系统提交的基于RSA证书加密的Credentials。3种完全不同的用户身份认证通过配置就可以统一在同一个CAS服务内,很好很强大,不是吗!! 定制身份验证登录界面 CAS Server在显示界面层view使用了“主题Theme”的概念。在{project.home}/webapp/WEB-INF/view/jsp/目录下,系统默认提供了两套得UI —— default和simple 。default方案使用了CSS等相对复杂得界面元素,而simple方案提供了最简化的界面表示方式。在整个的CAS Server服务器端,有四个界面是我们必须要实现的: casConfirmView.jsp —— 确认信息(警告信息)页面 casGenericSuccess.jsp —— 登陆成功提示页面 casLoginView.jsp —— 登录输入页面 casLogoutView.jsp —— SSO登出提示页面 这些都是标准的jsp页面,如何实现他们,完全由您说了算,除了名字不能改。 CAS为view的展示提供了3个级别的定制方式,让我们从最直观简单的开始吧。 1. 采用文件覆盖方式:直接修改default中的页面或者将新写好的四个jsp文件覆盖到default目录中。这种方式最直观和简单,但咖啡建议各位在使用这种方式前将原有目录中的文件备份一下,以备不时之需。 2. 修改UI配置文件,定位UI目录:在CAS Server端/webapp/WEB-INF/classes/ 目录下,有一个名为default_views.properties的属性配置文件,你可以通过修改配置文件中的各个页面文件位置,指向你新UI文件,来达到修改页面展示的目的。 3. 修改配置文件的配置文件,这话看起来有点别扭,其实一点不难理解。在方法2中的default_views.properties文件是一整套的UI页面配置。如果我想保存多套的UI页面配置就可以写多个的properties文件来保存这些配置。在CAS Server端/webapp/WEB-INF/目录下有cas-servlet.xml和cas.properties两个文件,cas-servlet.xml使用了cas.properties文件中的cas.viewResolver.basename属性来定义view属性文件的名字,因此你可以选者直接修改cas-servlet.xml中的viewResolver 下的basenames属性,或者修改cas.properties中的cas.viewResolver.basename属性,指定新的properties文件名,这样可以轻松的替换全套UI。 CAS客户端配置及API应用 CASFilter的配置 对于大部分web应用而言,使用CAS集成统一认证是相对简单的事,只要为需要认证的URL配置edu.yale.its.tp.cas.client.filter.CASFilter认证过滤器。下面我们就针对过滤器的配置进行说明。首先参看一下Filter的基本配置: 引用 ... CAS Filter edu.yale.its.tp.cas.client.filter.CASFilter edu.yale.its.tp.cas.client.filter.loginUrl https://secure.its.yale.edu/cas/login<;/param-value> edu.yale.its.tp.cas.client.filter.validateUrl https://secure.its.yale.edu/cas/serviceValidate<;/param-value> edu.yale.its.tp.cas.client.filter.serverName your server name and port (e.g., www.yale.edu:8080) CAS Filter /requires-cas-authetication// ... 上述配置中的init-param是filter的3个必备的属性,下面这张表则是filter全部属性的详细说明: ProxyTicketReceptor的配置 大家还记得在前面我们说过的Proxy Authentication中的call back URL吗?ProxyTicketReceptor是部署在client端的一个servlet,提供server端回传PGT和PGTIOU的。它的xml部署如下: 引用 ... ProxyTicketReceptor edu.yale.its.tp.cas.proxy.ProxyTicketReceptor edu.yale.its.tp.cas.proxyUrl https://secure.its.yale.edu/cas/proxy<;/param-value> ProxyTicketReceptor /CasProxyServlet ... 这里要说明的是它的参数edu.yale.its.tp.cas.proxyUrl。在服务端通过ProxyTicketReceptor将PGT和PGTIOU传给客户端后,ProxyTicketReceptor在进行Proxy Authentication的过程中需要向服务端请求一个ProxyTicket(PT),这个proxyUrl就是服务端的请求入口了。(关于Proxy Authentication的运作原理,参见JA-SIG(CAS)学习笔记2 ) CAS Client端的API应用1.用户可以通过以下两种方式的任意一种,从JSP或servlet中获取通过认证的用户名: 引用 String username = (String)session.getAttribute(CASFilter.CAS_FILTER_USER); 或者 String username = (String)session.getAttribute("edu.yale.its.tp.cas.client.filter.user"); 2.获得更完整的受认证用户信息对象CASReceipt Java Bean,可以使用以下语句的任一: 引用 CASReceipt receipt = (CASReceipt )session.getAttribute(CASFilter.CAS_FILTER_RECEIPT); 或者 CASReceipt receipt = (CASReceipt )session.getAttribute("edu.yale.its.tp.cas.client.filter.receipt"); 3.手工编码使用CAS Java Object进行用户验证,使用ServiceTicketValidator或者 ProxyTicketValidator(代理认证模式下),在servlet中对用户身份进行验证。 3-1.ServiceTicketValidator Java代码 import edu.yale.its.tp.cas.client./;
    ...
    String user = null;
    String errorCode = null;
    String errorMessage = null;
    String xmlResponse = null;

// instantiate a new ServiceTicketValidator // ServiceTicketValidator sv = new ServiceTicketValidator();

// set its parameters // sv.setCasValidateUrl("https://secure.its.yale.edu/cas/serviceValidate");
sv.setService(urlOfThisService);
sv.setServiceTicket(request.getParameter("ticket"));

String urlOfProxyCallbackServlet = "https://portal.yale.edu/CasProxyServlet";
sv.setProxyCallbackUrl(urlOfProxyCallbackServlet);

// contact CAS and validate // sv.validate();

// if we want to look at the raw response, we can use getResponse() // xmlResponse = sv.getResponse();

if(sv.isAuthenticationSuccesful()) {
user = sv.getUser();
} else {
errorCode = sv.getErrorCode();
errorMessage = sv.getErrorMessage();
}
// The user is now authenticated. // // If we did set the proxy callback url, we can get proxy tickets with: // String urlOfTargetService = "http://hkg2.its.yale.edu/someApp/portalFeed";
String proxyTicket = ProxyTicketReceptor.getProxyTicket( sv.getPgtIou() , urlOfTargetService); import edu.yale.its.tp.cas.client./; ... String user = null; String errorCode = null; String errorMessage = null; String xmlResponse = null; // instantiate a new ServiceTicketValidator // ServiceTicketValidator sv = new ServiceTicketValidator(); // set its parameters // sv.setCasValidateUrl("https://secure.its.yale.edu/cas/serviceValidate"); sv.setService(urlOfThisService); sv.setServiceTicket(request.getParameter("ticket")); String urlOfProxyCallbackServlet = "https://portal.yale.edu/CasProxyServlet"; sv.setProxyCallbackUrl(urlOfProxyCallbackServlet); // contact CAS and validate // sv.validate(); // if we want to look at the raw response, we can use getResponse() // xmlResponse = sv.getResponse(); if(sv.isAuthenticationSuccesful()) { user = sv.getUser(); } else { errorCode = sv.getErrorCode(); errorMessage = sv.getErrorMessage(); } // The user is now authenticated. // // If we did set the proxy callback url, we can get proxy tickets with: // String urlOfTargetService = "http://hkg2.its.yale.edu/someApp/portalFeed"; String proxyTicket = ProxyTicketReceptor.getProxyTicket( sv.getPgtIou() , urlOfTargetService); 3-2.ProxyTicketValidator Java代码 import edu.yale.its.tp.cas.client./;
...
String user = null;
String errorCode = null;
String errorMessage = null;
String xmlResponse = null;
List proxyList = null;

// instantiate a new ProxyTicketValidator // ProxyTicketValidator pv = new ProxyTicketValidator();

// set its parameters // pv.setCasValidateUrl("https://secure.its.yale.edu/cas/proxyValidate");
pv.setService(urlOfThisService);
pv.setServiceTicket(request.getParameter("ticket"));

String urlOfProxyCallbackServlet = "https://portal.yale.edu/CasProxyServlet";
pv.setProxyCallbackUrl(urlOfProxyCallbackServlet);

// contact CAS and validate // pv.validate();

// if we want to look at the raw response, we can use getResponse() // xmlResponse = pv.getResponse();

// read the response // if(pv.isAuthenticationSuccesful()) {
user = pv.getUser();
proxyList = pv.getProxyList();
} else {
errorCode = pv.getErrorCode();
errorMessage = pv.getErrorMessage();
// handle the error // }
// The user is now authenticated. //
// If we did set the proxy callback url, we can get proxy tickets with this method call: //
String urlOfTargetService = "http://hkg2.its.yale.edu/someApp/portalFeed";
String proxyTicket = ProxyTicketReceptor.getProxyTicket( pv.getPgtIou() , urlOfTargetService); import edu.yale.its.tp.cas.client./; ... String user = null; String errorCode = null; String errorMessage = null; String xmlResponse = null; List proxyList = null; // instantiate a new ProxyTicketValidator // ProxyTicketValidator pv = new ProxyTicketValidator(); // set its parameters // pv.setCasValidateUrl("https://secure.its.yale.edu/cas/proxyValidate"); pv.setService(urlOfThisService); pv.setServiceTicket(request.getParameter("ticket")); String urlOfProxyCallbackServlet = "https://portal.yale.edu/CasProxyServlet"; pv.setProxyCallbackUrl(urlOfProxyCallbackServlet); // contact CAS and validate // pv.validate(); // if we want to look at the raw response, we can use getResponse() // xmlResponse = pv.getResponse(); // read the response // if(pv.isAuthenticationSuccesful()) { user = pv.getUser(); proxyList = pv.getProxyList(); } else { errorCode = pv.getErrorCode(); errorMessage = pv.getErrorMessage(); // handle the error // } // The user is now authenticated. // // If we did set the proxy callback url, we can get proxy tickets with this method call: /*/ String urlOfTargetService = "http://hkg2.its.yale.edu/someApp/portalFeed"; String proxyTicket = ProxyTicketReceptor.getProxyTicket( pv.getPgtIou() , urlOfTargetService); 在这里,我们假设上下文环境中的用户已经通过了CAS登录认证,被重定向到当前的servlet下,我们在servlet中获取ticket凭证,servlet的URL对用户身份进行确认。如果上下文参数中无法获取ticket凭证,我们就认为用户尚未登录,那么,该servlet必须负责将用户重定向到CAS的登录页面去。 初战告捷 到今天为止,我们已经通过JA-SIG学习笔记的1-3部分,对CAS这个开源SSO的框架有了个大体的了解和初步的掌握,希望这些知识能为各位步入CAS殿堂打开一扇的大门。咖啡希望在今后的工作应用中,能同大家一块共同探讨,进一步深入了解CAS。 学无止境。。。。。。 分享到:

cas-server-3.3.2 使用举例 | cas 服务器端的配置

评论

发表评论

您还没有登录,请您登录后再发表评论

lvyanglin的博客

lvyanglin

  • 浏览: 11625 次
  • 性别: Icon_minigender_1
  • 来自: 广州
  • 最近访客 更多访客>>

shangyue1110的博客

shangyue1110

dylinshi126的博客

dylinshi126 dada7020的博客

dada7020

k175981998的博客

k175981998

文章分类

存档分类

  • 2011-12 (2)
  • 2011-11 (1)
  • 2011-05 (2)
  • 更多存档...

    最新评论

  • 403577706: sudo apt-get build-dep /#(packag ... sudo apt-get -f install 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。若作者同意转载,必须以超链接形式标明文章原始出处和作者。 © 2003-2011 ITeye.com. All rights reserved. [ 京ICP证110151号 京公网安备110105010620 ]

Use Javascript Redirection

Posted on

Use Javascript Redirection - CAS User Manual - Jasig Wiki

  1. Dashboard")
  2. CAS User Manual
  3. Navigation
  4. Advanced Topics
  5. Use Javascript Redirection

Use Javascript Redirection

Skip to end of metadata

Home

Overall Architecture

Authentication

Authentication Managers

Security Policy

TicketRegistry

Testing

Protocols

Advanced Topics

Tutorials and HOWTOs

Troubleshooting

Services Management

Extensions

  • ClearPass When redirecting from the https CAS application back to an http service after authenticating successfully, IE6 presents the user with a security dialog saying "you are about to be redirected to a connection that is not secure, do you really want to do this?". We can avoid this by using javascript to perform the redirection in the client browser, instead of a server side redirect. This approach works fine for web pages, but does not work for protected image content, which will not execute the returned javascript, so we revert to a serverside redirect for this type of content.
  1. Create WEB-INF/view/jsp/default/ui/redirect.jsp to perform the redirection using javascript ?<%

@page

import

=

"org.jasig.cas.authentication.principal.WebApplicationService"

%>

<%

@page

import

=

"org.jasig.cas.web.support.WebUtils"

%> <%

@page

import

=

"java.net.URL"

%>

<% WebApplicationService service = (WebApplicationService) request.getAttribute(

"service"

);

String ticket = (String) request.getAttribute(

"serviceTicketId"

); String redirectURL = service.getResponse(ticket).getUrl();

boolean

serverSideRedirect =

false

; // if redirect is for an image, js or css file

URL url =

new

URL(redirectURL); String path = url.getPath();

int

dotPos = path.lastIndexOf(

"."

);

// returns -1 if not found if

( dotPos != -

1

)

{

String ext = path.substring(dotPos).toLowerCase();

serverSideRedirect =

".gif"

.equals(ext) ||

".jpg"

.equals(ext) ||

".png"

.equals(ext) ||

".js"

.equals(ext) ||

".css"

.equals(ext); }

if

( serverSideRedirect ) {

// Serverside redirect using HTTP 302

response.sendRedirect(redirectURL);

} else

{

// Client side redirect using javascript

%> <!DOCTYPE html PUBLIC

"-//W3C//DTD XHTML 1.0 Transitional//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"

>

Redirect

<%

} %>

  1. Make a redirect view available to CAS by adding it to WEB-INF/classes/default_view.properties

?/#/#/# Redirect view (logged in, javascript redirect to service)

redirectView.(

class

)=org.springframework.web.servlet.view.JstlView redirectView.url=/WEB-INF/view/jsp/

default

/ui/redirect.jsp

  1. Modify WEB-INF/login-webflow.xml to make the redirect end state use the new view

?<end-state id=

"redirect"

view=

"redirectView"

/>

Labels:

None

Edit Labels") Powered by a free Atlassian Confluence Open Source Project License granted to Java Architectures Special Interest Group. Evaluate Confluence today. This Confluence installation runs a Free Gliffy License - Evaluate Gliffy for your Wiki!