CAS实现单点登录

前言

企业的信息化过程是一个循序渐进的过程,在企业各个业务网站逐步建设的过程中,根据各种业务信息水平的需要构建了相应的应用系统,由于这些应用系统一般是在不同的时期开发完成的,各应用系统由于功能侧重、设计方法和开发技术都有所不同,也就形成了各自独立的用户库和用户认证体系。随着新的业务网站不断的增加,用户在每个应用系统中都有独立的账号,这样就造成在访问不同的应用系统时,需要记录对应的用户名和密码,多个用户名密码极易记混,如果忘记或记错了某一个业务网站的用户名或密码就无法进行登录,耽误工作,影响工作效率,随着局内信息化进程的推进还会有新的应用系统产生,如果不引入单一用户登录的解决方案,全公司工作人名特别是承担审批权限的各级领导很难记清各类应用系统的用户名和密码,严重影响由信息化带来快捷性和高效性。此外,多个应用平台就有多个用户管理,这也为系统管理员维护人员系统带来巨大的工作量,例如,一次变更10个人员,即使只有5个应用系统,也需要重复维护50个人员信息,而企业的每次人员调整远不至10人,这种几何增长的维护工作量,会浪费大量的精力和时间,减弱了信息化系统带来方便快捷,为此,需建立一套统一的、完善的、科学的单点登录系统,每个用户只需记录一个用户名密码,登录一个平台后即可实现各应用系统的透明跳转,而且实行统一的用户信息管理系统,系统管理员只需维护一套人员信息,更改信息通过平台接口同步更新至各个应用系统,实现人员系统单次维护全公司同步变更,大大提高工作效率。

      新的应用系统在不断开发,早一天规划设计出单点登录的规范接口,就可以为新开发的系统提出的一种整合的标准,在开发初期无论哪个开发商,无论采用哪种技术开发,只要遵循单点登录的规范标准,新的系统开发完成之后即可无缝整合的到单点登录平台中,从而减少了系统开发完成后再整合到单点登录改动而造成资源的浪费。

      从信息共享角度看现有的各个业务系统都使用各自的数据存储方式,不经过基础的用户名和密码认证后,相互之间无法传递有效信息。为避免信息孤岛的产生,因此需要建立一个连接各个业务系统的技术架构和标准,实现平台统一化整合;通过对业务处理和异常处理实现监管透明;通过将业务流程从应用中抽离,实现业务流程的灵活安排,这样就需要一套可以整合现有各个业务网站的信息共享平台。

 

单点登录的英文名称为Single Sign-On,简写为SSO,它是一个用户认证的过程,允许用户一次性进行认证之后,就访问系统中不同的应用;而不需要访问每个应用时,都重新输入密码。IBM对SSO有一个形象的解释“单点登录、全网漫游”。

SSO将一个企业内部所有域中的用户登录和用户帐号管理集中到一起,SSO的好处显而易见:

  • 减少用户在不同系统中登录耗费的时间,减少用户登录出错的可能性
  • 实现安全的同时避免了处理和保存多套系统用户的认证信息
  • 减少了系统管理员增加、删除用户和修改用户权限的时间
  • 增加了安全性:系统管理员有了更好的方法管理用户,包括可以通过直接禁止和删除用户来取消该用户对所有系统资源的访问权限

对于内部有多种应用系统的企业来说,单点登录的效果是十分明显的。很多国际上的企业已经将单点登录作为系统设计的基本功能之一。

SSO的实现机制不尽相同,大体分为Cookie机制和Session机制两大类。

  • WebLogic通过Session共享认证信息。Session是一种服务器端机制,当客户端访问服务器时,服务器为客户端创建一个惟一的SessionID,以使在整个交互过程中始终保持状态,而交互的信息则可由应用自行指定,因此用Session方式实现SSO,不能在多个浏览器之间实现单点登录,但却可以跨域。
  • WebSphere通过Cookie记录认证信息。Cookie是一种客户端机制,它存储的内容主要包括: 名字、值、过期时间、路径和域,路径与域合在一起就构成了Cookie的作用范围,因此用Cookie方式可实现SSO,但域名必须相同。

CAS http://www.ja-sig.org/products/cas/,CAS单点登录系统最早由耶鲁大学开发。2004年12月,CAS成为JA-SIG中的一个项目。JA-SIG的全称是Java Architectures Special Interest Group,是在高校中推广和探讨基于Java的开源技术的一个组织。CAS的优点很多,例如设计理念先进、体系结构合理、配置简单、客户端支持广泛、技术成熟等等。这也是我们这次SSO改造的参照产品。

CAS 具有以下特点:

  • 开源的企业级单点登录解决方案。
  • CAS Server 为需要独立部署的 Web 应用。
  • CAS Client 支持非常多的客户端(这里指单点登录系统中的各个 Web 应用),包括 Java, .Net, PHP, Perl, Apache, uPortal, Ruby 等。
  • CAS 原理和协议

从结构上看,CAS 包含两个部分: CAS Server 和 CAS Client。CAS Server 需要独立部署,主要负责对用户的认证工作;CAS Client 负责处理对客户端受保护资源的访问请求,需要登录时,重定向到 CAS Server。图1 是 CAS 最基本的协议过程:

 

CAS Client 与受保护的客户端应用部署在一起,以 Filter 方式保护受保护的资源。对于访问受保护资源的每个 Web 请求,CAS Client 会分析该请求的 Http 请求中是否包含 Service Ticket,如果没有,则说明当前用户尚未登录,于是将请求重定向到指定好的 CAS Server 登录地址,并传递 Service (也就是要访问的目的资源地址),以便登录成功过后转回该地址。用户在第 3 步中输入认证信息,如果登录成功,CAS Server 随机产生一个相当长度、唯一、不可伪造的 Service Ticket,并缓存以待将来验证,之后系统自动重定向到 Service 所在地址,并为客户端浏览器设置一个 Ticket Granted Cookie(TGC),CAS Client 在拿到 Service 和新产生的 Ticket 过后,在第 5,6 步中与 CAS Server 进行身份合适,以确保 Service Ticket 的合法性。

在该协议中,所有与 CAS 的交互均采用 SSL 协议,确保,ST 和 TGC 的安全性。协议工作过程中会有 2 次重定向的过程,但是 CAS Client 与 CAS Server 之间进行 Ticket 验证的过程对于用户是透明的。

以CAS为例,使用Cookie实现单点登录的原理图如图1所示。

  • 首先,单点登录分为“服务端”和“客户端”。服务端就是单点登录服务器,而客户端通常是“函数库”或者“插件”。需要使用单点登录的应用程序,需要把客户端插件安装到自己的系统中,或者将客户端函数库包括在代码中。单点登录的客户端通常替换了原来应用程序的认证部分的代码。
  • 某个应用程序首先要发起第1次认证。大部分情况下,应用程序中嵌入的客户端会把应用程序原来的登录画面屏蔽掉,而直接转到单点登录服务器的登录页面。

             

           图 1 使用Cookie实现单点登录的原理图

  • 用户在单点登录服务器的登录页面中,输入用户名和密码。
  • 然后单点登录服务器会对用户名和密码进行认证。认证本身并不是单点登录服务器的功能,因此,通常会引入某种认证机制。认证机制可以有很多种,例如自己写一个认证程序,或者使用一些标准的认证方法,例如LDAP或者数据库等等。在大多数情况下,会使用LDAP进行认证。这是因为LDAP在处理用户登录方面,有很多独特的优势,这在本文的后面还会比较详细地进行介绍。
  • 认证通过之后,单点登录服务器会和应用程序进行一个比较复杂的交互,这通常是某种授权机制。CAS使用的是所谓的Ticket。具体这点后面还会介绍。
  • 授权完成后,CAS把页面重定向,回到Web应用。Web应用此时就完成了成功的登录(当然这也是单点登录的客户端,根据返回的Ticket信息进行判断成功的)。
  • 然后单点登录服务器会在客户端创建一个Cookie。注意,是在用户的客户端,而不是服务端创建一个Cookie。这个Cookie是一个加密的Cookie,其中保存了用户登录的信息。
  • 如果用户此时希望进入其他Web应用程序,则安装在这些应用程序中的单点登录客户端,首先仍然会重定向到CAS服务器。不过此时CAS服务器不再要求用户输入用户名和密码,而是首先自动寻找Cookie,根据Cookie中保存的信息,进行登录。登录之后,CAS重定向回到用户的应用程序。

这样,就不再需要用户继续输入用户名和密码,从而实现了单点登录。

注意,这种单点登录体系中,并没有通过http进行密码的传递(但是有用户名的传递),因此是十分安全的。

CAS被设计为一个独立的Web应用,目前是通过若干个Java servlets来实现的。CAS必须运行在支持SSL的web服务器至上。应用程序可以通过三个URL路径来使用CAS,分别是登录URL(login URL),校验URL(validation URL)和登出URL(logout URL)。

       

  • 应用程序一开始,通常跳过原来的登陆界面,而直接转向CAS自带的登录界面。当然也可以在应用程序的主界面上增加一个登录之类的按钮,来完成跳转工作。
  • 如果用户喜欢的话,也可以手工直接进入CAS的登录界面,先进行登录,在启动其他的应用程序。不过这种模式主要用于测试环境。
  • CAS的登录界面处理所谓的“主体认证”。它要求用户输入用户名和密码,就像普通的登录界面一样。
  • 主体认证时,CAS获取用户名和密码,然后通过某种认证机制进行认证。通常认证机制是LDAP。
  • 为了进行以后的单点登录,CAS向浏览器送回一个所谓的“内存cookie”。这种cookie并不是真的保存在内存中,而只是浏览器一关闭,cookie就自动过期。这个cookie称为“ticket-granting cookie”,用来表明用户已经成功地登录。
  • 认证成功后,CAS服务器创建一个很长的、随机生成的字符串,称为“Ticket”。随后,CAS将这个ticket和成功登录的用户,以及服务联系在一起。这个ticket是一次性使用的一种凭证,它只对登录成功的用户及其服务使用一次。使用过以后立刻失效。
  • 主体认证完成后,CAS将用户的浏览器重定向,回到原来的应用。CAS客户端,在从应用转向CAS的时候,同时也会记录原始的URL,因此CAS知道谁在调用自己。CAS重定向的时候,将ticket作为一个参数传递回去。
  • 例如原始应用的网址是http://www.itil.com/,在这个网址上,一开始有如下语句,转向CAS服务器的单点登录页面https://secure.oa.com/cas/login?service=http://www.itil.com/auth.aspx。
  • CAS完成主体认证后,会使用下面URL进行重定向http://www.itil.com/authenticate.aspx?ticket= ST-2-7FahVdQ0rYdQxHFBIkKgfYCrcoSHRTsFZ2w-20。
  • 收到ticket之后,应用程序需要验证ticket。这是通过将ticket 传递给一个校验URL来实现的。校验URL也是CAS服务器提供的。
  • CAS通过校验路径获得了ticket之后,通过内部的数据库对其进行判断。如果判断是有效性,则返回一个NetID给应用程序。
  • 随后CAS将ticket作废,并且在客户端留下一个cookie。
  • 以后其他应用程序就使用这个cookie进行认证(当然通过CAS的客户端),而不再需要输入用户名和密码。

目 录

0. 文档介绍

0.1 文档目的

0.2 文档范围

0.3 读者对象

0.4 参考文献

0.5 术语与缩写解释

1.    概述

1.1背景

1.2环境

1.3下载资源

2. 配置CAS SERVER

2.1简单配置

2.2数据库验证配置

2.3HTTPS验证配置

2.4HTTP验证配置

2.5修改页面

3. 配置JAVA CLIENT

3.1HTTPS验证

3.2HTTP验证

4. 配置DOTNET CLIENT

5. 配置PHP CLIENT

6. 如何实现单点注销


0. 文档介绍

0.1 文档目的

记录使用CAS实现SSO的过程。

0.2 文档范围

    使用CAS实现SSO的过程。

0.3 读者对象

    任何有兴趣的家伙。

0.4 参考文献

提示:列出本文档的所有参考文献(可以是非正式出版物),格式如下:

[标识符] 作者,文献名称,出版单位(或归属单位),日期

 

大部分都是网络上查询的资料,很多,不列举了。

 

0.5 术语与缩写解释

缩写、术语

 

SSO

即Single sign on/off,单点登录/退出

CAS

全称JA-SIG Central Authentication Service,实现SSO的开源项目

 

 

 

 

 

 

 

1.      概述

1.1背景

       单点登录是必须的,实现方式颇多,这里就说使用CAS的实现方式。使用CAS实现SSO,网络上说明很多,大部分都是从制作证书开始,而实际上是可以不使用HTTPS验证,这样更方便。

       单点登录的原理是通过拦截你设定的URL,并跳转到你指定的CAS SERVER登录页,当你登录成功后,带着TICKET,返回到你打开的URL。然后你就可以一票在手,畅通无阻。

       网上有个家伙用旅游的套票来解释单点登录,非常形象。当你到达一个旅游区门口,你可以买一个套票,套票规定你可以游览N个景点,进入这些景点的时候,你不需要再买票,也就实现了单点登录。

       同时,也可以借用这个比喻说明一下单点注销。当你打开一个应用A时,单击了注销按钮,跳转到http://hostname:port/cas/logout 或者https://hostname:port/cas/logout ,系统显示注销成功。此时,IE窗口没有关闭,你继续打开应用A,仍然没有注销成功,不需要登录。这就相当于你已经在旅游景点内,即使你把套票撕毁了,你仍然可以继续参观这个景点,不会把你驱逐出去。但是,你再也进不了其它的景点了。

       那么怎么实现立即生效的注销呢?或者这种方式是否就满足我们的需求呢?

1.2环境

   Windows XP、JDK1.7.0_45、Tomcat7.0.27注意:安装好环境。

A.在服务器上安装JDK

 

 

B.在服务器上安装Tomcat

 

 

1.3下载资源

官网下载地址:http://downloads.jasig.org/cas-clients/

CAS服务器环境如下:32位系统

CAS服务器版本: cas-server-3.4.2.1-release

Jdk: jdk-7u45-windows-i586.exe

Tomcat: apache-tomcat-7.0.27.exe

            cas-client-2.0.11.zip              JAVA支持单点登录

            cas-client-3.1.8-release.zip    JAVA支持单点注销

              dotnet-client-1.0.2-bin           DOTNET客户端

              phpcas                                     PHP客户端

注意:同时要下载源代码,部分功能(JAVAhttp协议)需要修改源代码,重新做包。

2. 配置CAS SERVER

CAS SERVER目录介绍。

2.1简单配置

解压缩下载下来的“cas-server-3.4.2.1-release.zip”,

在“modules”文件夹中找到“cas-server-webapp-3.4.2.1.war”,将其重命名为“cas.war”

将“cas.war”拷贝到“%TOMCAT_HOME%\webapps”文件夹下。稍等一会儿刷新一下,就会看到Tomcat自动将“cas.war”解压到“cas”文件夹中。如下图:

 

在默认配置下,CAS认为只要用户名密码相同即登录成功。我们可以通过修改配置以实现基于数据库的身份验证。不过目前我们先以默认配置进行测试。

在浏览器中输入网址“https://localhost:8443/cas/login”,如果IE有证书警告信息,直接点击“继续浏览此网站(不推荐)。

 

如果用户名与密码相同,则系统显示登录成功:

 

用户可以在浏览器中输入网址“https://localhost:8443/cas/logout”,则系统自动完成注销操作。

 

至此,服务器端配置全部完成。

 

 

2.2数据库验证配置

       下载 Microsoft JDBC Driver for SQL Server

(1)Microsoft JDBC Driver 4.0 for SQL Server 下载地址:http://www.microsoft.com/zh-cn/download/details.aspx?id=11774

网站提供了两种格式文件供下载,一种是自解压的EXE格式文件,还有一种是tar.gz格式的压缩文件。两种格式选其一下载即可,经过解压缩,可以得到两个JAR格式文件:sqljdbc.jar与sqljdbc4.jar。

(2)将“sqljdbc4.jar”拷贝至“%TOMCAT_HOME%\webapps\cas\WEB-INF\lib”文件夹。

(3)在之前从CAS网站下载“cas-server-3.5.1-release.zip”并解压缩。在解压缩的文件下中找到“modules\cas-server-support-jdbc-3.5.1.jar”,将其一并拷贝至“%TOMCAT_HOME%\webapps\cas\WEB-INF\lib”文件夹。

 

3.2.创建用于身份验证的数据库

(1)启动SQL Server,新建一数据库“UsersDB”,并在其中建立表“Users”,字段如下:

 

(2)在表中输入若干测试数据:

 

 

 

 

3.3.配置CAS实现基于数据库的身份验证

(1)以管理员身份启动文本编辑工具,打开“%TOMCAT_HOME%\webapps\cas\WEB-INF\deployerConfigContext.xml”。找到下面的代码

<bean id="authenticationManager"
    class="org.jasig.cas.authentication.AuthenticationManagerImpl">

(2)在该段代码前面插入 SQL Server JDBC 数据源配置信息:

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"></property>
    <property name="url" value="jdbc:sqlserver://192.168.0.123:1433;databaseName=UsersDB"></property>
    <property name="username" value="sa"></property>
    <property name="password" value="123456"></property>
</bean>

如下图所示:

 

(3)找到如下配置信息:

<bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" />

该配置信息使用SimpleTestUsernamePasswordAuthenticationHandler验证用户,即默认用户名和密码相同则验证通过,用户名密码不同则登录失败。我们需要将其替换成基于数据库验证的配置信息。

首先将上面的配置信息注释掉,并在其下面插入如下配置信息:

<bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
    <property name="sql" value="select Password from users where username=?" />
    <property name="dataSource" ref="dataSource" />
</bean>

如图所示:

 

说明:如果你安装的是SQL Server 2008,那么默认TCP/IP访问协议不会打开,因此无法通过IP地址的方式访问SQL Server数据,解决办法就是启动SQL Server配置管理器,并在里面启用TCP/IP,启用后记得重新启动SQL Server服务以使设置生效。如图所示:

 

(4)保存对“%TOMCAT_HOME%\webapps\cas\WEB-INF\deployerConfigContext.xml”所做的修改。

(5)重新启动 Tomcat 服务。

 (6) 打开CAS页面进行测试

2.3 HTTPS验证配置

(1)生成证书

在C盘根目录下建立子文件夹“Keys”,用于存放证书。

单击“开始 -> 运行",输入“cmd”,单击“确定”启动命令提示符窗口。

输入“cd "c:\Program Files\Java\jre7\bin"”进入jre7的bin目录下。

执行命令创建证书。:“keytool -genkey -alias tomcat -keyalg RSA -storepass changeit -keystore c:\keys\.keystore -validity 3600”

注意:名字与姓氏要输入主机名或域名或localhost,不能随意输入。密码为自己设定。下面的密码直接回车。

如图:

 

(2)将证书导入的JDK的证书信任库中

第一步:导出证书。

执行命令“keytool -export -trustcacerts -alias tomcat -file c:\keys\tomcat.cer -keystore c:\keys\.keystore -storepass changeit”将证书导出到Keys文件夹。

第二步:将证书导入到JDK证书信任库。

执行命令“keytool -import -trustcacerts -alias tomcat -file c:\keys\tomcat.cer -keystore "C:\Program Files\Java\jre7\lib\security\cacerts" -storepass changeit”。系统询问是否信任此证书,回答“y”。

 注意:这里需要输入密码,此密码不是前面设定的密码,是系统默认的密码changeit

 

其他有用keytool命令(列出信任证书库中所有已有证书,删除库中某个证书):

keytool -list -v -keystore "C:\Program Files\Java\jre7\lib\security\cacerts"

keytool -delete -trustcacerts -alias tomcat -keystore "C:\Program Files\Java\jre7\lib\security\cacerts" -storepass changeit

(3)配置server.xml文件(服务器需要https登陆验证)

以管理员身份运行文字编辑器,打开%TOMCAT_HOME%\conf\server.xml。查找SSL配置并将如下内容插入其中。

<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol" SSLEnabled="true"

               maxThreads="150" scheme="https" secure="true"

               clientAuth="false" sslProtocol="TLS"

               keystoreFile="C:/Keys/.keystore"

               keystorePass="changeit" />

如下图所示:

 

(4) 测试TomcatSSL是否配置成功

(A)重启Tomcat服务。

(B)打开IE浏览器,分别测试“http://localhost:8080”和“https://localhost:8443/”

 

由于此网站出具的安全证书不是由受信任的证书颁发机构颁发的,因此IE会有警告信息,这里我们直接点击“继续浏览此网站(不推荐)。 ”。

 

如果看到上面的界面,说明Tomcat的SSL配置成功。

   

2.4HTTP验证配置(不需要制作证书)和修改COOKE时间

  1. 修改tomcat\webapps\cas\WEB-INF\deployerConfigContext.xml

<bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"p:httpClient-ref="httpClient"/>

  增加参数p:requireSecure="false",是否需要安全验证,即HTTPS,false为不采用,加上去之后如下:

<bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler" p:httpClient-ref="httpClient"  p:requireSecure="false"/>

  1. Tomcat6.0\webapps\cas\WEB-INF\spring-configuration\ticketGrantingTicketCookieGenerator.xml

<bean id="ticketGrantingTicketCookieGenerator"class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"  p:cookieSecure="true"  p:cookieMaxAge="-1"  p:cookieName="CASTGC" p:cookiePath="/cas" />

参数p:cookieSecure="true",同理为HTTPS验证相关,TRUE为采用HTTPS验证,与deployerConfigContext.xml的参数保持一致。

参数p:cookieMaxAge="-1",简单说是COOKIE的最大生命周期,-1为无生命周期,即只在当前打开的IE窗口有效,IE关闭或重新打开其它窗口,仍会要求验证。可以根据需要修改为大于0的数字,比如3600等,意思是在3600秒内,打开任意IE窗口,都不需要验证。

warnCookieGenerator.xml

<bean id="warnCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"   p:cookieSecure="true"   p:cookieMaxAge="-1"  p:cookieName="CASPRIVACY"   p:cookiePath="/cas" />

两个参数与上面同理。

TICKET的生命周期也可以在web.xml加这个参数实现:

<!-- Timeout for granting tickets -->

      <context-param>   <param-name>edu.yale.its.tp.cas.grantingTimeout</param-name>

<param-value>7200</param-value>  </context-param>

     

        

2.5修改页面    

CAS页面文件放在Tomcat 6.0\webapps\cas\WEB-INF\view\jsp中,页面配置文件在Tomcat 6.0\webapps\cas\WEB-INF\classes中,比如default_views.properties,在这里指定登录用哪个页面,注销用哪个页面等等。

在Tomcat 6.0\webapps\cas\WEB-INF\cas.properties文件指定使用哪个皮肤页面。

下面开始操作:        

建议不要在原有的文件上进行修改,最好建立一份新的theme。

备份C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\cas

将cas项目复制,命名为castest,我们对castest项目进行修改

CAS登录页面存放在“%TOMCAT_HOME%\webapps\cas\WEB-INF\view\jsp\default\ui”文件夹下,该文件夹内有多个jsp文件,主要包括:

页面

功能

casConfirmView.jsp

在浏览器跳转到用户想要访问的页面之前如果有警告信息,这个页面将会被显示。

casGenericSuccess.jsp

这个页面一般不会被显示,除非我们直接访问验证服务器的验证界面。

casLoginView.jsp

重点修改的页面。这个就是输入验证信息的界面。

casLogoutView.jsp

注销界面。

serviceErrorView.jsp

如果用户想要访问的服务没有使用CAS,这个页面将会显示出来。注意:如果我们所有的业务系统都使用了CAS,这个界面则会没有任何作用。

上表所列页面绝大多数无需修改,主要是“casLoginView.jsp”还有includes目录下的“top.jsp”、“bottom.jsp”两个文件。

 

具体办法如下:

(1)使用浏览器调试工具(IE浏览器使用F12键)查看页面结构,为后续定义CSS文件做好准备。下图显示了登录页面的主体结构:

 

文档分header、content、footer三部分,其中content内部又包括login和siderbar两部分内容。如果在定义登录页面时需要调整网页结构,记得CSS样式的层级结构也一并加以修改。

(2)使用网页编辑器编辑保存的离线网页,在尽量不修改页面内容的条件下通过修改CSS样式对登录页面加以调整。

casLoginView.jsp样式文件:cas\css\cas.css 图片路径: cas\images js路径: cas\js

(3) 保存全部修改。启动Tomcat服务,测试下效果。有可能显示原来的界面,可尝试把“%TOMCAT_HOME%\work\Catalina”目录下的文件夹清空掉再试。

下图是经过加工后的CAS登录页面:

 

 

其它需要说明的地方:

(1)“%TOMCAT_HOME%\webapps\cas\js\cas.js”文件中“$(document).ready”方法包含了部分动画显示错误信息的javascript脚本,这可以根据你页面样式的不同适当进行调整(主要是颜色)。

(2)在“%TOMCAT_HOME%\webapps\cas\WEB-INF\classes”文件夹下存在很多messages_*.properties文件,主要是为了国际化。如果对页面呈现的文字进行修改,可以修改“messages_zh_CN.properties”文件中的信息。

2.6 密码加密MD5

   修改Tomcat 7.0\webapps\cas\WEB-INF deployerConfigContext.xml文件

<bean id="MD5PasswordEncoder"

    class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder">

    <constructor-arg index="0" value="MD5" />

    </bean>

 

<property name="passwordEncoder" ref="MD5PasswordEncoder" ></property>

 

3. 配置JAVA CLIENT

3.1 HTTPS验证

       1、把casclient.jar、cas-client-3.1.8.jar复制到你的jsp工程的WEB-INF\lib里;

       2、修改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>edu.yale.its.tp.cas.client.filter.CASFilter</filter-class>

<!—下面两个为验证地址,即cas server的地址,如果使用https验证,地址为https://hostname:8443字样- ->

    <init-param>

      <param-name>edu.yale.its.tp.cas.client.filter.loginUrl</param-name>

       <param-value>http://10.16.204.26:8443/cas/login</param-value>

    </init-param>

    <init-param>

       <param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name>

       <param-value>http://10.16.204.26:8443/cas/serviceValidate</param-value>

</init-param>

<!—本工程的URL,被拦截的地址- ->

    <init-param>

       <param-name>edu.yale.its.tp.cas.client.filter.serverName</param-name>

       <param-value>localhost:8080</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>

 

   3、在页面获得验证返回的用户

用户可以通过以下方式,从JSP或servlet中获取通过认证的用户名:

String username = (String)session.getAttribute(edu.yale.its.tp.cas.client.filter.CASFilter.CAS_FILTER_USER);

获得更完整的受认证用户信息对象CASReceipt Java Bean,可以使用以下语句:

CASReceipt  receipt = (CASReceipt )session.getAttribute(edu.yale.its.tp.cas.client.filter.CASFilter.CAS_FILTER_RECEIPT);

       完成以上后,进行测试。出现错误时,请查看tomcat\logs文件解决。

3.2 HTTP验证

找到客户端使用的casclient.jar文件,借用反编译工具将相应的class文件反编译成java文件再进行下面的修改

1、找到edu.yale.its.tp.cas.client.filter.edu.yale.its.tp.cas.client.filter

 

Java代码

if (! casValidate.startsWith("https://")){ 

            throw new ServletException("validateUrl must start with https://, its current value is [" + casValidate + "]"); 

        } 

if (casServiceUrl != null){ 

            if (! (casServiceUrl.startsWith("https://")|| (casServiceUrl.startsWith("http://") ))){ 

                throw new ServletException("service URL must start with http:// or https://; its current value is [" + casServiceUrl + "]"); 

            } 

        } 

 

把这两段内容注释掉(此目录下涉及修改的类文件有CASFilter.java、CASValidateFilter.java,其实所有的修改就是把与https有关的内容加以注释)

 

2、找到edu.yale.its.tp.cas.util.SecureURL

 

Java代码

if (!u.getProtocol().equals("https")){ 

                // IOException may not be the best exception we could throw here 

                // since the problem is with the URL argument we were passed, not 

                // IO. -awp9 

                log.error("retrieve(" + url + ") on an illegal URL since protocol was not https."); 

                            throw new IOException("only 'https' URLs are valid for this method"); 

            } 

 

把这段内容注释掉

 

4. 配置ASP.NET CLIENT

1)          已配置版本:3.4.2.1的cas 服务端,URL地址:http://218.18.96.51:8443/cas/login,测试用户及密码:test

2)         需要从官网下载cas.net服务端dotnet-client-1.0.2-bin

3)         客户端dll:DotNetCasClient.dll

4)         获取用户账号的示例代码:

            Session["username"] = null;

            if (!this.IsPostBack)

            {

                userName = (String)Session["username"];

                if (string.IsNullOrEmpty(userName))

                {

                    DotNetCASClientServiceValidate client = new DotNetCASClientServiceValidate();

              userName = client.Authenticate(Request, Response, true);

                }

                 Session["username"] = userName;

                 labUserName.Text = userName;

            }

5)         将DotNetCasClient.dll导入到项目中

6)         修改web.xml 文件,添加以下代码 

<appSettings>

<add key="casLoginURL"   <add key="casValidateURL" value="http://10.16.204.26:8443/cas/serviceValidate"/>

<add key="serviceURL" value="http://10.16.204.26:8088/PassWordMiddify.aspx"/>

<add key="casLoginOutURL" value="http://10.16.204.26:8443/cas/logout?service=http://10.16.204.26:8443/cas"/>

</appSettings>

如图所示:

 

 

 

 

 

   在页面的load事件中加入

      Session["username"] = null;

            if (!this.IsPostBack)

            {

                userName = (String)Session["username"];

                if (string.IsNullOrEmpty(userName))

                {

                    DotNetCASClientServiceValidate client = new DotNetCASClientServiceValidate();

              userName = client.Authenticate(Request, Response, true);

                }

                 Session["username"] = userName;

                 labUserName.Text = userName;

            }

 

 

如图所示:

 

编译项目,并发布。

 

5. 配置PHP CLIENT

1)检查php.ini文件中的extentions看curl和openssl是否打开,默认OA都是开启的,如未开启去掉“;”,并检查相应的dll是否存在,php.ini文件一般存在OA安装目录BIN下。

 

2)下载php-cas客户端,见webroot文件夹。主要有包含 cas.php和CAS文件夹,如图所示:

 

  调用方法:

 

核心思想:通过CAS客户端的类获取服务器的工号,然后OA只验证工号,密码无需验证就可以通过。

6. 如何实现单点注销

 

通过http://10.16.204.26:8443/cas/logout?service=http://10.16.204.26:8443/cas/login 来实现

 

 

 

8.首页显示登录信息

 

由于CAS的封装,我们无法获取COOKies中信息,只能通过JS登录时写入信息到js中COOKies来实现

  1. 1.         登录页

修改casLoginView.jsp页面,添加JS存入cookie

         <script type="text/javascript">

                            function setCookie(){   

                            var username_str=document.getElementById("username").value;

                            var newcookie='usercode'+"="+username_str;

                            document.cookie=newcookie;

                   }

所下图所示

 

 

  1. 2.         首页

修改casGenericSuccess.jsp页面,添加JS来获取cookies显示用户信息

<script type="text/javascript">

// 获取指定名称的cookie值

   function getCookie(name){

   var result = null;

   var myCookie = document.cookie + ";";

   var searchName = name + "=";

   var startOfCookie = myCookie.indexOf(searchName);

   var endOfCookie;

   if (startOfCookie != -1)

           {

            startOfCookie += searchName.length;

            endOfCookie = myCookie.indexOf(";",startOfCookie);

            result = unescape(myCookie.substring(startOfCookie, endOfCookie));

      }

       return result;

   }

   document.getElementById('usercode').innerHTML='欢迎:'+ getCookie('usercode');

 </script>

 

9.相关知识点

 

术语解释:

  • HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容请看SSL。它是一个URI scheme(抽象标识符体系),句法类同http:体系。用于安全的HTTP数据传输。https:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)。这个系统的最初研发由网景公司进行,提供了身份验证与加密通讯方法,现在它被广泛用于万维网上安全敏感的通讯。
  • LDAP(全称是Lightweight Directory Access Protocol),一般都简称为LDAP。它是基于X.500标准的,但是简单多了并且可以根据需要定制。与X.500不同,LDAP支持TCP/IP,这对访问Internet是必须的。LDAP的核心规范在RFC中都有定义,所有与LDAP相关的RFC都可以在LDAPman RFC网页中找到。

简单说来,LDAP是一个得到关于人或者资源的集中、静态数据的快速方式。LDAP协议是跨平台的和标准的协议,因此应用程序就不用为LDAP目录放在什么样的服务器上操心了。实际上,LDAP得到了业界的广泛认可,因为它是Internet的标准。产商都很愿意在产品中加入对LDAP的支持,因为他们根本不用考虑另一端(客户端或服务端)是怎么样的。LDAP服务器可以是任何一个开发源代码或商用的LDAP目录服务器(或者还可能是具有LDAP界面的关系型数据库),因为可以用同样的协议、客户端连接软件包和查询命令与LDAP服务器进行交互。

 

posted @ 2015-03-19 16:05  水一木  阅读(2013)  评论(0编辑  收藏  举报