首页 > 应用开发 > Java > 22 CAS实现单点登录体验
目 录
记录使用 CAS 实现 SSO 的过程。
使用 CAS 实现 SSO 的过程 。
任何有兴趣的家伙。
提示: 列出本文档的所有参考文献(可以是非正式出版物),格式如下:
[ 标识符] 作者,文献名称,出版单位(或归属单位),日期
大部分都是网络上查询的资料,很多,不列举了。
|
缩写、术语 |
解 释 |
|
SSO |
即 Single sign on/off ,单点登录 / 退出 |
|
CAS |
全称 JA-SIG Central Authentication Service ,实现 SSO 的开源项目 |
|
|
|
|
|
|
|
… |
|
单点登录是必须的,实现方式颇多,这里就说使用 CAS 的实现方式。使用 CAS 实现 SSO ,网络上说明很多,大部分都是从制作证书开始,而实际上是可以不使用 HTTPS 验证,这样更方便。
单点登录的原理是通过拦截 你设定的 URL ,并跳转到 你指定的 CAS SERVER 登录页,当你登录成功后,带着 TICKET ,返回到 你打开的 URL 。然后你就可以一票在手,畅通无阻。
网上有个家伙用旅游的套票来解释单点登录,非常形象。当你到达一个旅游区门口,你可以买一个套票,套票规定你可以游览 N 个景点,进入这些景点的时候,你不需要再买票,也就实现了单点登录。
同时,也可以借用这个比喻说明一下单点注销。当你打开一个应用 A 时,单击了注销按钮,跳转到 http://hostname:port/cas/logout 或者 https://hostname:port/cas/logout ,系统显示注销成功。此时, IE 窗口没有关闭,你继续打开应用 A ,仍然没有注销成功,不需要登录。这就相当于你已经在旅游景点内,即使你把套票撕毁了,你仍然可以继续参观这个景点,不会把你驱逐出去。但是,你再也进不了其它的景点了。
那么怎么实现立即生效的注销呢?或者这种方式是否就满足我们的需求呢?
Windows XP 、 JDK1.6.03 、 Tomcat6.0.20
注意:配置好环境变量。
服务器端: http://www.ja-sig.org/downloads/cas
当前最新版本是 3.3.4 ,测试安装的版本为 3.3.3
客户端: 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 支持
注意:同时要下载源代码,部分功能需要修改源代码,重新做包。
CAS SERVER 目录介绍。
把你下载 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 的配置。
简单配置后,可以使用相同的用户名和密码,进行登录。这个不实际,可以通过配置实现连接自己的数据库进行配置。这里有个前提,就是所有系统需要使用相同的用户表和密码加密方法,可以使用 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 日志文件,进行检查,问题很容易解决。
这里只说明一下我涉及到的参数,可能有更多参数,目前还没有用到。
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 -->
证书的制作使用 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 ,进行测试。
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">
这个不要修改 , 否则出现 http code 500 for url 。
1 、把 casclient.jar 、 cas-client-3.1.8.jar 复制到你的 jsp 工程的 WEB-INF\lib 里;
2 、修改 web.xml ,增加下面的代码:
<!-- 用于单点退出 -->
<!-- 用于单点登录 -->
下面两个为验证地址,即 cas server 的地址,如果使用 https 验证,地址为 https://hostname:8443 字样 - ->
本工程的 URL ,被拦截的地址 - ->
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 文件解决。
1 、修改 casclient.jar 中文件,如图:
2 、重新做 jar 包,复制到工程目录
完成后,做好测试。登录成功后的样子,如下图:
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 为用户名。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/725190/viewspace-626592/ ,如需转载,请注明出处,否则将追究法律责任。