下面我们以 tomcat 5.0 作为 CAS Server(server1) ,另外一台 tomcat5.0 为 client(client1)
为例进行说明。
1. 下载 cas-server 和 cas-client( 可选,建议使用)
http://www.ja-sig.org/downloads/cas/cas-server-3.0.5.zip
http://www.ja-sig.org/downloads/cas-clients/cas-client-java-2.1.1.zip
2. 将 cas-server-3.0.5.zip 解压,并将 lib/cas.war 拷贝到 server1 的 webapps 下
3. 产生 SERVER 的证书
PS: 参数与各系统本身一致
%JAVA_HOME%\bin\keytool -delete -alias tomcat -keypass changeit
%JAVA_HOME%\bin\keytool -genkey -alias tomcat -keypass changeit -keyalg RSA
%JAVA_HOME%\bin\keytool -export -alias tomcat -keypass changeit -file %FILE_NAME%
%JAVA_HOME%\bin\keytool -import -file server.crt -keypass changeit -keystore %JAVA_HOME%/jre/lib/security/cacerts
%JAVA_HOME%\bin\keytool -import -file server.crt -keystore %JAVA_HOME%\jre\lib\security\cacerts
4. 在 server1 配置 tomcat 使用 HTTPS
$CATALINA_HOME/conf/server.xml 里
<Connector className="org.apache.coyote.tomcat5.CoyoteConnector"
port="8443" minProcessors="5" maxProcessors="75"
enableLookups="true" disableUploadTimeout="true"
acceptCount="100" debug="0" scheme="https"
secure="true">
<Factory className="org.apache.coyote.tomcat5.CoyoteServerSocketFactory"
keystoreFile="/path/to/your/keystore-file"
keystorePass="your-password" clientAuth="false" protocol="TLS" />
</Connector>
5. 在要使用 CAS 的客户端 client1 里设置(以 servlets-examples 这个 APP 为例),我们使用
ServletFilter(CAS client 里提供的 ) 来实现 SSO 的检查。
修改 servlets-examples/WEB-INF/web.xml
<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://your.cas.server.name(eg:server1):port/cas/login</param-value>
</init-param>
<init-param>
<param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name>
<param-value>https://your.cas.server.name(eg:server1):port/cas/proxyValidate</param-value>
</init-param>
<init-param>
<param-name>edu.yale.its.tp.cas.client.filter.serviceUrl</param-name>
<param-value>your.client.server.ip(eg:127.0.0.1):port</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CASFilter</filter-name>
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>
PS: 在 client 端配置 filter 时 , 需要将 CAS 的 filter 放在 web.xml 最上端 ,. 如果在你的 web.xml 有类似 encodingFilter 的 filter 也需要将这个 filter 放在 CAS filter 下面 , 否则你会发现每次访问时都需要你进行验证 。
6. 将 cas-client-java-2.1.1.zip 解压,把 java/lib/casclient.jar 拷贝到 client1 服务器上的
webapps/servlets-examples/WEB-INF/lib 目录下(如果没有就建一个)
7. 导出 SERVER 的证书,用来给所有需要用到的客户端导入
keytool -export -file server.crt -alias my-alias-name -keystore keystore-file
8. 在客户端的 JVM 里导入信任的 SERVER 的证书 ( 根据情况有可能需要管理员权限 )
keytool -import -keystore $JAVA_HOME/jre/lib/security/cacerts -file server.crt -alias my-alias-name
9.test & done.
把 server1 和 client1 分别起来,检查启动的 LOG 是否正常,如果一切 OK ,就访问
http://client1:8080/servlets-examples/servlet/HelloWorldExample
系统会自动跳转到一个验证页面,随便输入一个相同的账号 , 密码,验证通过之后就会访问
到真正的 HelloWorldExample 这个 servlet 了
实现自已的认证代码 (java 代码和相关注释 , 需要 cas-server-3.0.5.jar 包 )
package com.mcm.sso; 

import org.jasig.cas.authentication.handler.support.AbstractUsernamePasswordAuthenticationHandler; 
import org.jasig.cas.authentication.principal.UsernamePasswordCredentials; 
import org.springframework.util.StringUtils; 

public class MyUsernamePasswordAuthenticationHandler extends 
AbstractUsernamePasswordAuthenticationHandler { 

public boolean authenticateUsernamePasswordInternal( 
final UsernamePasswordCredentials credentials) { 
final String username = credentials.getUsername(); 
final String password = credentials.getPassword(); 

// 此处实现你的登陆验证代码
if (StringUtils.hasText(username) && StringUtils.hasText(password) ) { 
getLog().debug( 
" User [ " + username + " ] was successfully authenticated with ucix. " ); 
return true ; 
} 

getLog().debug( " User [ " + username + " ] failed authentication " ); 

return false ; 
} 

protected void afterPropertiesSetInternal() throws Exception { 
super .afterPropertiesSetInternal(); 
} 
} 

然后将这个类配置到 deployerConfigContext.xml 文件里 , 替代 <bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" />
可能要用到数据库连接之类的配置,具体可参照 spring framework 相关文档
在 client 端取到登陆相关信息及登出系统
1. 取得用用户 ID
以下两种方式都可以
session.getAttribute(CASFilter.CAS_FILTER_USER);
session.getAttribute("edu.yale.its.tp.cas.client.filter.user");
也可以直接取得认证 java 对象
session.getAttribute(CASFilter.CAS_FILTER_RECEIPT);
session.getAttribute("edu.yale.its.tp.cas.client.filter.receipt");
JSP2.0 标准写法
<c:out value="${sessionScope['edu.yale.its.tp.cas.client.filter.user']}"/>
在 jsp 中使用 CAS Tag Library 标签
除实现以上功能完还可以实现登出之类的相关功能,具体参照 cas 官方文档
AbstractUsernamePasswordAuthenticationHandler







