CAS单点登陆实例实现

下面我们以 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 官方文档

http://www.ja-sig.org/products/cas/client/jsp/index.html

Tags: cas, 单点登陆

« 上一篇 | 下一篇 »

信息推荐

只显示10条记录相关文章

部署结构和单点登录 (浏览: 535, 评论: 0)
CAS单点登陆原理 (浏览: 1917, 评论: 0)

发表评论