ITPub博客

首页 > 应用开发 > Java > 22 CAS实现单点登录体验

22 CAS实现单点登录体验

原创 Java 作者:isongoo 时间:2010-02-01 18:49:58 0 删除 编辑

目 录

0. 文档介绍 ... 2

0.1 文档目的 ... 2

0.2 文档范围 ... 2

0.3 读者对象 ... 2

0.4 参考文献 ... 2

0.5 术语与缩写解释 ... 2

1.     概述 ... 3

1.1 背景 ... 3

1.2 环境 ... 3

1.3 下载资源 ... 3

2. 配置 CAS SERVER .. 4

2.1 简单配置 ... 4

2.2 数据库验证配置 ... 5

2.3 参数配置 ... 8

2.4HTTPS 验证配置 ... 10

2.5 自定义页面 ... 14

3. 配置 JAVA CLIENT . 17

3.1HTTPS 验证 ... 17

3.2HTTP 验证 ... 19

4. 配置 DOTNET CLIENT . 20

5. 配置 PHP CLIENT . 24

6. 如何实现单点注销 ... 24


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.6.03 、 Tomcat6.0.20

注意:配置好环境变量。

1.3 下载资源

服务器端: http://www.ja-sig.org/downloads/cas

当前最新版本是 3.3.4 ,测试安装的版本为 3.3.3

cas-server-3.3.3-release.zip

客户端: https://www.ja-sig.org/svn/cas-clients/

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

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

       dotnet-client                                 DOTNET 支持类

       phpcas                                        PHP 支持

      

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

2. 配置 CAS SERVER

CAS SERVER 目录介绍。

2.1 简单配置

       把你下载 cas-server 解压,进入 cas-server-3.3\modules ,复制 cas-server-webapp-3.3.war 到 tomcat\webapps 下,修改名称为 cas.war ,方便使用,原来的名字太长了。然后启动 IE ,输入 http://localhost:8080/cas 检验是否可以访问,如果可以,则输入相同的用户名和密码,比如 cas/cas ,测试是否能登录。

       如果你对安全性要求不高且急不可待,这个时候就可以直接进行 CAS CLIENT 的配置。

 

2.2 数据库验证配置

       简单配置后,可以使用相同的用户名和密码,进行登录。这个不实际,可以通过配置实现连接自己的数据库进行配置。这里有个前提,就是所有系统需要使用相同的用户表和密码加密方法,可以使用 CAS 自带的加密方法( \org\jasig\cas\authentication\handler\ DefaultPasswordEncoder.class )或自己用 JAVA 写的加密方法。

       进入目录 tomcat\webapps\cas\WEB-INF ,打开文件 deployerConfigContext.xml ,找到类似下面的代码:

注意 : cas-server 根据版本不同 , 文件的路径或 BEAN 位置可能不同 , 逐个文件夹找下。

 

 

这是默认的方法。同时还有两种可选,如下:

             

             

             

/************************************************************************/

                        abstract="false" lazy-init="default" autowire="default" dependency-check="default">

                           

                       

                       

                       

                       

                       

以上两种方式都经过测试。另外,也可以写出自己的方法验证,修改 BEAN 的 CLASS 属性即可。如果没有密码没有加密,则可以把参数 去掉。

 

下面针对最下面的方法进行说明。

       看它的属性,还需要定义两个 BEAN ,数据源和加密,如下:

      

      

                    

                    

                    

                    

           

      -->  

<!--ORACLE à    

      

             

             

             

 

             

             

             

                   

       

 

   加密 à

       

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

         

由于 CAS-SERVER.WAR 默认没有采用数据库加密,所以部分 JAR 包,没有引入,下面这些需要复制到 webapps\cas\WEB-INF\lib 里面:

Cas-server-support-jdbc-3.3.3.jar

Cas-server-support-ldap-3.3.3.jar

Commons-dbcp.jar

Commons-pool.jar

Org.springframework.jdbc-3.0.0.M4.jar         //spring 要根据自己的版本选择

Org.springframework.transaction-3.0.0.M4.jar

Sqljdbc.jar                                                              // 数据库连接 JAR ,根据自己的复制

Oraclejdbc.jar

完成以后,用户表数据准备好后,可以运行 http://localhost:8080/cas 进行登录测试。这个时候很容易出现错误,多数是因为 JAR 包问题,注意查看 tomcat\logs 日志文件,进行检查,问题很容易解决。

2.3 参数配置

       这里只说明一下我涉及到的参数,可能有更多参数,目前还没有用到。

       1 、 tomcat\webapps\cas\WEB-INF\ deployerConfigContext.xml

                                   p:httpClient-ref="httpClient"/>

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

                                   p:httpClient-ref="httpClient"   p:requireSecure="false"/>

 

       2 、 Tomcat 6.0\webapps\cas\WEB-INF\spring-configuration\

ticketGrantingTicketCookieGenerator.xml

              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

              p:cookieSecure="true"

              p:cookieMaxAge="-1"

              p:cookieName="CASPRIVACY"

              p:cookiePath="/cas" />

两个参数与上面同理。

 

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

<!-- Timeout for granting tickets -->

   

        edu.yale.its.tp.cas.grantingTimeout

        7200

   

2.4HTTPS 验证配置

       证书的制作使用 keytool 工具,进入 CMD ,输入 keytool ,回车测试,如果出现帮助,则说明环境变量配置正确,如果没有,则配置 PATH ,加入 %JAVA_HOME%\BIN 。

下面开始制作,先找好存放证书的位置:

(1)        keytool -genkey -alias tomcatcas -keystore tomcatcas -keyalg RSA -validity 3666

这一步是制作密钥库。

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

( 2 ) keytool -export -alias tomcatcas -keystore tomcatcas -file tomcatcas.crt

       这一步是把密钥库导出为证书文件。

注意:密码为上一步设定的密码。

 

( 3 ) keytool -import -alias tomcatcas -file tomcatcas.crt

-keystore %JAVA_HOME%/jre/lib/security/cacerts

         这一步是把证书导入 TOMCAT 。

后面的路径为 TOMCAT 使用的 JRE 路径, JDK1.6 安装有两个目录 JDK1.6 和 JRE1.6 , TOMCAT6.0 只要 JRE1.6 即可,通常在安装时,也都是默认到 JRE1.6 ,这时要输入 %JRE_HOME%\lib\security\cacerts ,这个地方必须要确认准确。

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

 

( 4 )配置 tomcat6.0\conf\server.xml

<!--

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

               clientAuth="false" sslProtocol="TLS"

               />

à

加入密钥库文件和密码(前面设定的密码),修改为

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

               clientAuth="false" sslProtocol="TLS"

               keystoreFile="d:\data\tomcatcas.keystore"

               keystorePass="123456"

               />

注意:密钥库文件的要放到安全的位置,不能被随意移动。

完成后,可重启 TOMCAT ,进行测试。

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 文件指定使用哪个皮肤页面。

       下面开始操作:

       1 、进入 Tomcat 6.0\webapps\cas\WEB-INF\view\jsp ,复制 default 文件夹,并改名,再复制回来,如 myth 。

       2 、进入 Tomcat 6.0\webapps\cas\WEB-INF\classes ,复制 default_views.properties ,并改名再复制回来,如 myth_views.properties 。打开文件,把里面的目录 ..\jsp\default\ui 修改为自己的路径,如 ..\jsp\myth\ui 。

       3 、进入 Tomcat 6.0\webapps\cas\WEB-INF ,打开 cas.properties 文件,修改

cas.viewResolver.basename=myth_views

完成以上 3 步后 , 打开 IE , 进入 http://localhost:8080/cas 进行测试 , 如果成功则进行下一步 。

注意:文件中 logout 使用的类。

4 、修改页面样式

 

 

最后一点说明, Tomcat 6.0\webapps\cas\WEB-INF\cas-server.xml 中,有个 BEAN :

      

              p:order="0">

             

                    

                            ${cas.viewResolver.basename}

                            protocol_views

                    

             

      

这个不要修改 , 否则出现 http code 500 for url 。

3. 配置 JAVA CLIENT

3.1HTTPS 验证

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

       2 、修改 web.xml ,增加下面的代码:

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

  org.jasig.cas.client.session.SingleSignOutHttpSessionListener

    CAS Single Sign Out Filter

    org.jasig.cas.client.session.SingleSignOutFilter

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

CAS Filter

edu.yale.its.tp.cas.client.filter.CASFilter

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

   

      edu.yale.its.tp.cas.client.filter.loginUrl

       http://c7.byd.com:8080/cas/login

   

   

       edu.yale.its.tp.cas.client.filter.validateUrl

       http://c7.byd.com:8080/cas/serviceValidate

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

   

       edu.yale.its.tp.cas.client.filter.serverName

       localhost:8080

   

 

    CAS Single Sign Out Filter

    /*

 

    CAS Filter

    /*

       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.2HTTP 验证

       1 、修改 casclient.jar 中文件,如图:

      

       2 、重新做 jar 包,复制到工程目录

      

       完成后,做好测试。登录成功后的样子,如下图:

4. 配置 DOTNET CLIENT

       1 、把 DotNetCasClient.cs 复制到 DotNet 项目

 

 

       2 、新建 loginPage.aspx , Page_Load 加入代码

DotNetCASClient.DotNetCASClientServiceValidate client = new DotNetCASClient.DotNetCASClientServiceValidate();

            String userId = client.Authenticate(Request, Response, false);

            if (userId.Equals("failed"))

            {

                //Handle the auth failure...

            }

            else

            {

                Session[DotNetCASClient.SessionHandle.getUserSession()] = userId;

                FormsAuthentication.RedirectFromLoginPage(userId, false);

            }

注意: FormsAuthentication.RedirectFromLoginPage 这个方法。

      

 

       3 、在 Default.aspx 的 Page_Load 内加入获得用户的代码:

       4 、修改 web.config 文件

        

                  

                  

                  

        

        

 

   

                  

                           

                  

                  

                           

                  

        

      

      

       完成后,运行测试,效果如下图:

Cas 为用户名。

5. 配置 PHP CLIENT

6. 如何实现单点注销

 

 

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/725190/viewspace-626592/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
我是45岁的老人了,没有学习能力了。

注册时间:2008-04-10

  • 博文量
    34
  • 访问量
    56956