首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

转载 单点登录(三)

2012-12-24 
转载 单点登录(3)?原文:http://www.iteye.com/topic/165313技术背景知识: ? JA-SIG CAS服务环境搭建,请参

转载 单点登录(3)

?原文:http://www.iteye.com/topic/165313
转载 单点登录(三)

技术背景知识:
? 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接口就行。以下是该接口的源代码:

          <beans xmlns="http://www.springframework.org/schema/beans"
          ?????? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          ?????? xmlns:p="http://www.springframework.org/schema/p"
          ?????? xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

          <bean id="authenticationManager"
          ? p:httpClient-ref="httpClient" />
          ??????? <!—下面就是系统默认的验证器配置,你可以替换它,或者增加一个新的handler -->
          ??? <bean???? />
          ?? </list>
          ? </property>
          </bean>
          。。。
          。。。
          </beans>


          我们发现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的基本配置:



          ProxyTicketReceptor的配置
          ??? 大家还记得在前面我们说过的Proxy Authentication中的call back URL吗?ProxyTicketReceptor是部署在client端的一个servlet,提供server端回传PGT和PGTIOU的。它的xml部署如下:

              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。

              ----------------------------------------------------------


热点排行