读书人

CAS 单点登录应用详解

发布时间: 2012-06-28 15:20:03 作者: rapoo

CAS 单点登录使用详解

?

??????????????????? 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 />

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

<bean value="select password from seasky where username=?" />

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

</bean>

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

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

?

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

<bean id="dataSource" 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

?

读书人网 >软件架构设计

热点推荐