CAS 单点登录使用详解

CAS 单点登录使用详解

分类: CAS   266人阅读  评论(1)  收藏  举报

==============================================================================

开发环境 :MyEclipse6.5+tomcat6.0+JDK6.0+MySQL5.0+CAS

开发环境搭建 : 基本搭建环境省略不提

            这里主要介绍 CAS 环境搭建及配置步骤 :

1. 下载 CAS 的最新版本 :   服务端下载地址 : http://www.ja-sig.org/downloads/cas/

                       客户端下载地址 : http://www.ja-sig.org/downloads/cas-clients/

  这里下载的为 : 服务端 : cas-server-3.3.5-release.zip 客户端 : cas-client-2.0.11.zip

2. 关于 CAS 的详细介绍 , 可以查询网络 , 也可以参见我的另一篇笔记之 === >>

CAS 单点登录详细介绍 .docx

这里主要介绍它在单点登陆方面的使用及配置说明 :

3. 分别解压服务端端和客户端 zip 包 , 在服务端应用程序中找到 :cas-server-webapp-3.3.5.war

  只是 CAS 服务端验证的主要验证服务 , 修改文件名为 :cas.war, 然后将此 war 包部署到 tomcat 的 webapp 目录中 ;

  首先我们必须用 JDK 包中的 keytool 工具创建证书文件 :

  步骤 : 首先进入 cmd, 切换任意盘 : 如 F:

  输入 : F:/>keytool -genkey -alias server -keyalg RSA -keystore server.keystore

  回车 === >

  然后根据提示向导完成信息的详细填写 : 

  (

注意事项 :-alias server  中 server 为生成该证书的名字为 server, 也就是该证书的别名 ;

-keystore server.keystore 中的 server.keystore 为生成的证书文件的名字 ;

存放在 F: 盘下的 server.keystore 就是生成的证书文件

  然后根据提示信息输入密码 , 两次的秘密都相同 , 这里设置都输入密码 :tiankong 

  接下来为非常关键的一步 : 提示 === >> 你的名字与姓氏是什么 ?

  CAS 部署服务器机器中存在的域名,本机使用 localhost 测试 !

( 实际上是需要在 CAS 客户端服务配置中需要使用的自定义域名名称 ,

localhost 本身有定义 , 不需要自己再重新添加定义 , 这里我们先使用部署在同一

机器上的 localhost 默认域名 )

  这里输入 :localhost

  其他的可以随便输入 , 这里依次都输入为 tiankong

  提示正确吗 ?

  输入 :y  === >> 回车

  提示 : 输入 server 的主密码 :

(如果和 keystore 密码相同,按回车): ==== >> 回车

   终于完成 === >>> 证书文件生成成功 !

)

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

输入 keystore 密码:

再次输入新密码 :

您的名字与姓氏是什么?

  [Unknown] :   localhost

您的组织单位名称是什么?

  [Unknown] :   tiankong

您的组织名称是什么?

  [Unknown] :   tiankong

您所在的城市或区域名称是什么?

  [Unknown] :   tiankong

您所在的州或省份名称是什么?

  [Unknown] :   tiankong

该单位的两字母国家代码是什么

  [Unknown] :   tiankong

CN=localhost, OU=tiankong, O=tiankong, L=tiankong, ST=tiankong, C=tiankong 正确吗?

  [ 否 ] :   y

输入 <server> 的主密码

        (如果和 keystore 密码相同,按回车):

F:/>

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

接下来我们必须在 tomcat6 的安装目录下的 conf 目录下找到 server.xml 文件 , 在其中找到以下已经注释的配置 :

  <!--

    <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"

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

               clientAuth="false" sslProtocol="TLS" />

  -->

  复制一份放在下面的位置 , 修改后的配置为 :

  <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"

                    keystorePass="tiankong" keystoreFile="conf/server.keystore"

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

               clientAuth="false" sslProtocol="TLS" />

  ( 注意 : 红色的部分是新添加上去的 , 这里用到了证书文件 sever.keystore, 放置的目录为 :tomcat6 的安装目录下的 conf 下 , keystorePass=”tiankong”, 指明了该证书文件的密码 , 其实就是生成证书时提示输入设置的密码 ! 上面设置为 :tiankong, 这里输入密码 :tiankong)

  接下来我们必须在 : 将 F: 盘下生成的 server.keystore 文件复制到 tomcat6 的安装目录下的  

  Conf 目录下 ;

  接下来我们测试我们这一步所作的配置操作是否有问题 :

  首先启动 tomcat6 服务器 , 确定没有错误信息 , 有一个小警告不用管 , 是提示我们修改 CAS 服务器默认的登录验证方式 ;( 只要用户名和密码正确 , 就可以成功的登录系统 )

  IE 地址栏中输入 :https://localhost:8443/  然后确定 tomcat6 控制台 , 也没有出现错误信息 ; 

  好了确定我们这一步的操作没有任何问题 !

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

  好在这里我们还需要做一些工作为下面的操作服务 :

  导出密钥文件 : ==== >> 目的是将该密钥文件导入客户端服务器的 JVM 中 ;

  ( 必须指明别名 , 默认的别名为 mykey, 这里的别名就是创建证书文件时

  用 -alias server 参数指明的别名 :server)

  这里需要用到生成密钥文件的密码 :

  依然切换 server.keystore 文件所在的 F: 盘下 :

  输入命令 :

keytool -export -file server.crt -keystore server.keystore -storepass tiankong -alias server

这里指定了导出密钥文件的完整名称 :server.crt  指定了使用的证书文件 :server.keystore

证书文件的密码 :tiankong  证书文件的别名 :server

这是我们可以看到在在 F: 盘根目录下生成了密钥文件 :server.crt

  为库户端服务器的 JVM 导入密钥文件 :

  因为服务端 CAS 需要和客户端应用程序建立可靠 , 信任的通信 , 所以必须将服务端导出的密钥导文件导入到客户端应用程序服务器的 JVM 中 , 以建立可靠信任的连接通信 ; 这里由于是本机测试 , 可以直接在本机的 JVM 中导入信任密钥文件 ; 步骤如下 :

  注意 : 如果客户端应用部署在不同的计算机上 , 必须在那一台计算机中导入密钥文件 ;  

  ( 注意导入证书的时候最好指明证书的别名 , 便于查看和管理 ; 不指明默认的别名为 :mykey)

  ( 千万注意这里使用的 jre 的安装目录的位置 , 注意这里 tomcat 默认使用的 jre 是

单独的 jre 安装目录 , 不是 JDK 安装目录下所包含的 jre 安装目录 )

  首先切换到 Jre 的安装目录 : D:/MyProgram/Java/jre6/lib/security

  把上一步中导出的密钥文件复制到该目录下 ,

然后运行命令 :

keytool -import -keystore cacerts -storepass changeit -file server.crt -alias server

由于该目录下本身存在 cacerts 密钥文件库 , 本身的密码为 changeit, 所以这里使用密码 changeit, 否则 , 可以自己随意的指定任意的密码 ;

导入成功之后可以删除复制过来的多余的文件 ,server.crt

( 注意 Jre 默认的识别的证书库的文件名为 :cacerts, 不能自己任意指定名称 , 所以这里不能自己定义名称 , 下面的一种方式也是同理的证书库文件名不能自己随意指定 )

也可以在任意目录 :( 如 F: 盘 ) 运行 :

( 注意在这里我们可以任意的指定自己任意的密码 :tiankong)

keytool -import -keystore cacerts -storepass tiankong -file server.crt -alias server

然后 F: 盘下就会生成 cacerts 文件 , 然后将此文件复制到

Jre 的安装目录 : D:/MyProgram/Java/jre6/lib/security 目录下覆盖原有的 cacerts 文件 , 可是可以的 ;( 当然不主张这样的做法 , 这样会覆盖 Jre 中原有的一些证书 )

  另外在这里我们介绍以下查看证书文件中证书的方法以及删除证书文件中证书的方法 ;

  查看证书文件 :

  (1). 查看证书文件 :server.keystore

  keytool -list -keystore server.keystore -storepass tiankong –alias server

  (2). 查看证书文件 :cacerts

  keytool -list -keystore cacerts -storepass changeit -alias seasky

  ( 注意不指明别名查看的是证书文件中所有的证书 ; 指明别名 , 只查看别名为该名称的证书 )

删除证书文件中的别名为 seasky 的证书 : ( 删除证书的时候必须指明要删除证书的别名 )

(1)==== >>>

keytool -delete -keystore server.keystore -storepass tiankong -alias server

  (2)==== >>>

  keytool -delete -keystore cacerts -storepass changeit –alias server

  显示证书的详细信息 ==== >>> ( 也可以不指明证书别名 )

keytool -list -keystore server.keystore -storepass tiankong –alias server -v

4. 解压客户端 zip 包 , 在其中找到客户端的支持依赖 jar 包 : casclient.jar ( 这个 jar 包是客户端应用服务系统中必须要加入的依赖包 ), 任意新建一个 web 项目 . 例如 web 项目的名字为 :Web 举例 , 首先把该 Jar 包复制到该项目的 WEB-INF 目录下的 lib 目录下 ;

  然后需要在该项目的 web.xml 中配置 CAS 过滤器 :

  内容如下 :

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

    <filter>

       <filter-name> casFilter </filter-name>

       <filter-class>

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

       </filter-class>

       <init-param>

           <param-name>

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

           </param-name>

           <param-value> https://seasky:8443/cas/login </param-value>

       </init-param>

       <init-param>

           <param-name>

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

           </param-name>

           <param-value>

              https://seasky:8443/cas/proxyValidate

           </param-value>

       </init-param>

       <init-param>

           <param-name>

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

           </param-name>

           <param-value> localhost:8088 </param-value>

       </init-param>

    </filter>

    <filter-mapping>

       <filter-name> casFilter </filter-name>

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

   </filter-mapping>

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

下面对该配置详细讲解 :

首先 : 该过滤器对所有的请求都会进行拦截 ; 由 filter-mapping 中的 /* 指明 ;

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

该参数指明验证没有通过需要转发的登录页面 !

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

该参数指明验证的地址 !

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

指明需要拦截验证的客户端应用程序域名和端口号 !

( 必须使用 localhost 域名映射本机的 iP 地址 )

千万注意 : 由于 CAS 路径不支持 IP 地址 , 只支持域名 ; 所以这里地址的配置的地址使用了

自定义的域名 === >>> seasky   另外一个域名是本身就存在的域名地址 :localhost 表示的是

本机的映射地址 :127.0.0.1 ( 可以在 C:/WINDOWS/system32/drivers/etc 路径下的 hosts 文件中查看定义 )

如果服务器端服务和客户端服务都部署在同一台计算器中 , 这里都统一使用 localhost 域名是没有问题的 ;

犹如这里使用了 seasky 自定义域名所以必须要添加自定义域名设置 , 同理在 hosts 文件

仿照 localhost 的定义添加一个 seasky 域名 , 如下 :

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

127.0.0.1       localhost

192.168.8.21    seasky

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

到这里我们基本配置完成 !

5. 下面我们进行测试 :

  在 IE 地址栏输入 :http://localhost:8088/Web 访问默认的 index.jsp 主页面 , 由于我们没有登录 , 所以页面会转发到 CAS 服务端同一的登录页面进行同一的登录页面进行登录 ; 输入用户名和密码 ,( 只要用户名和密码相同 ,CAS 默认的验证方式 , 实际使用的时候需要修改验证机制 ) 就可以正确的登录 Web 项目的 index.jsp 页面了 ! 这是如果就其他的客户端项目 , 只要在浏览器没有关闭的情况下 , 就可以直接访问了 , 退出之后不管访问那个客户端 , 都必须重新登录 , 其他的 web 项目的配置 , 和部署 , 参照该 web 项目的部署情况 )

===============================================================================

  下面我介绍当服务端应用和服务端应用部署在不同机器上的配置的区别和注意事项 :

(1). 首先创建证书的时候不能使用默认的本机域名 localhost, 必须添加自定义任意的

自定义域名 !

(2). 配置客户端的时候 , 我们必须注意使用的自定义的域名名称 !

(3). 由于部署在不能的机器 , 我们需要向部署客户端服务的服务器的 JVM 中导入证书文件 ;

   ( 导入的方法 , 上面已经介绍过 . 这里不再啰嗦 )

===============================================================================

在实际的运用 CAS 的时候我们需要修改 CAS 服务端 , 默认的验证机制 , 需要借助数据库来判断正确的用户名和密码 ;( 根据需要 CAS 的页码样式也需要作相应的调整 , 这里不做详细介绍 )

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

下面主要介绍数据库的验证机制 :

这里我们使用的数据库为 :MySQL5.0,

所以需要 MySQL 驱动包 ==== >>mysql-connector-java-5.0.5.jar

另外需要 ==>> cas-server-jdbc-3.0.5-rc2.jar 依赖包 ,

可以在 http://developer.jasig.org/repo/content/repositories/m1/cas/jars/ 此网站下载该依赖包 ;

把这两个依赖包复制到 cas 服务端的 WEB-INF 目录下的 lib 目录下 ;

修改默认的验证机制 :

在 cas 服务端的 WEB-INF 目录下 , 找到 deployerConfigContext.xml

在其中找到 bean 定义 :

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

然后将此 bean 的定义注释 ; 然后在它的下面添加如下 bean 定义 :

<bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">

       <property name="sql" value="select password from seasky where username=?" />

        <property name="dataSource" ref="dataSource" />

</bean>

此处的 SQL 语句指明了 , 需要查询数据表的验证机制 ;

( 千万注意表的的 username 字段的值不能重复 , 该字段的值必须是唯一的 , 不然无法验证成功 )

另外在 <beans></beans> 节点中添加一个数据源 bean 的定义如下 :

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" destroy-method="close">

<property name="driverClassName">

<value>com.mysql.jdbc.Driver</value>

</property>

   <property name="url">

<value>jdbc:mysql://192.168.8.4:3306/test</value>

</property>

   <property name="username"><value>neo</value></property>

   <property name="password"><value>test??</value></property>

</bean>

注意检查确保连接数据库的配置信息是正确的 ;

最后我们需要在 test 数据库建立下 seasky 表 === >>>

 Create TABLE `seasky` (
                  `username` varchar(30) NOT NULL default '',
                  `password` varchar(45) NOT NULL default '',
                  PRIMARY KEY  (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

插入数据记录 : ( 注意 username 字段的值不能重复 )

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

 Insert INTO `seasky` (`username`,`password`) VALUES

                    ('tiankong1','admin'),

                   (' tiankong2','admin');

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

我们还需要在 Web 的 index.jsp 页面显示用户名 , 所以修改 index.jsp 页面 ;

<%@ page contentType= "text/html; charset=utf-8" %>

< html>

    < head>

       < title> This is web test jsp page!</ title>

    </ head>

    < body>

       < h1>

           This is tiankong work!

       </ h1>

       <%

String username =(String)session.getAttribute

( "edu.yale.its.tp.cas.client.filter.user" );

        %>

       < p> 当前得登陆用户: <%= username %> </ p>

       <%

           username = (String) session

          .getAttribute( "edu.yale.its.tp.cas.client.filter.user" );

       %>

        < p> 当前得登陆用户: <%= username %> </ p>

    </ body>

</ html>

最后需要验证一下 , 打开 IE 输入 http://localhost:8088/Web === >> 跳转 CAS 登录页面

==== >> 输入用户名 :tiankong1 密码 :admin ===== >>> 成功访问 Web 项目的 index.jsp 页面 !

===============================================================================                


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/tiankong_dream/archive/2010/03/30/5432330.aspx

猜你喜欢

转载自rongdmmap-126-com.iteye.com/blog/1417721