|
1 什么是SSO
单点登录(SSO,Single Sign-on)是一种方便用户访问多个系统的技术,用户只需在登录时进行一次注册,就可以在多个系统间自由穿梭,不必重复输入用户名和密码来确定身份。 单点登录的实质就是安全上下文(Security Context)或凭证(Credential)在多个应用系统之间的传递或共享。当用户登录系统时,客户端软件根据用户的凭证(例如用户名和密码)为用 户建立一个安全上下文,安全上下文包含用于验证用户的安全信息,系统用这个安全上下文和安全策略来判断用户是否具有访问系统资源的权限。
2 什么是CAS
Yale CAS (Central Authentication Service,中央认证服务)是耶鲁大学的一个开源项目。它为耶鲁大学的网络应用提供了一种标准的用户认证服务,从而实现了SSO的功能。Yale CAS被设计成为一个独立的网络应用程序,它使用javaServlet技术实现,可以作为用户身份认证模块加入到网络应用中。官方网站http://www.ja-sig.org/products/cas。
3 所需环境
l WindowsXP SP2
l JDK5.0
l Tomcat5.0.28
l ANT 1.6.5
l CAS Server 3.0.4
http://www.ja-sig.org/downloads/cas/cas-server-3.0.4.zip
l Yale Java Client 2.1.1
http://www.ja-sig.org/downloads/ ... ient-java-2.1.1.zip
4 服务端的配置
4.1 生成安全证书
首先在命令行中切换到 %java_home%\jre\lib\security目录,然后运行
%java_home%\bin\keytool -genkey -alias tomcat -keyalg RSA
密码是:changeit,姓名是:localhost,其他随便写的。
然后运行
%java_home%\bin\keytool -export -alias tomcat -file server.crt
%java_home%\bin\keytool -import -file server.crt -keystore %java_home%/jre/lib/security/cacerts
将C:\Documents and Settings\username\.keystore复制到c:\
4.2 打开tomcat5.0的SSL
修改Tomcat配置文件%tomcat_home%\conf\server.xml,去掉对于SSL的注释,即开放8443端口,并添加以下内容:keystoreFile="c:\\.keystore" keystorePass="changeit"。修改以后内容如下:
<Connector port="8443" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" disableUploadTimeout="true" acceptCount="100" debug="0" scheme="https" secure="true" clientAuth="false" keystoreFile="c:\\.keystore" keystorePass="changeit" sslProtocol="TLS" />
重新启动Tomcat。
4.3 发布CAS应用
CAS server3.0.4中target目录中的CAS.war复制到%tomcat_home%\webapps目录下。在浏览器中打开https://localhost:8443/cas,会提示你是否接受证书,接受后出现登陆页面,输入任意的用户名,密码和用户名必须相同,你可以看到登陆成功的页面。
5 认证代码的实现
5.1 代码
认证的类需要实现AuthenticationHandler接口,如果你想简单一点也可以从类AbstractUsernamePasswordAuthenticationHandler继承。实现代码如下:SimpleTestUsernamePasswordAuthenticationHandler.java package test; import org.jasig.cas.authentication.principal.UsernamePasswordCredentials;import org.jasig.cas.authentication.handler.support.*;import org.springframework.util.StringUtils; public final class SimpleTestUsernamePasswordAuthenticationHandler 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) && getPasswordEncoder().encode(password).equals(Integer.toString(username.length()))) { getLog().debug( "User [" + username + "] was successfully authenticated."); return true; } getLog().debug("User [" + username + "] failed authentication"); return false; } protected void afterPropertiesSetInternal() throws Exception { super.afterPropertiesSetInternal(); getLog() .warn( this.getClass().getName() + " is only to be used in a testing environment. NEVER enable this in a production environment."); }}将SimpleTestUsernamePasswordAuthenticationHandler.java复制到cas-server-3.0.4\localPlugins\src\test下面。5.2 打包并发布
修改cas-server-3.0.4\webapp\WEB-INF\ deployerConfigContext.xml文件将<bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" />修改为<bean class="test.SimpleTestUsernamePasswordAuthenticationHandler" />此处修改CAS Server认证时调用我们编写的类。进入cas-server-3.0.4\localPlugins\,运行ant war打包,将cas-server-3.0.4\localPlugins\target\cas.war重新发布到tomcat。在浏览器中打开https://localhost:8443/cas,会提示你是否接受证书,接受后出现登陆页面,输入任意的用户名,密码和用户名长度相同,你可以看到登陆成功的页面。说明我们编写的类已经正常工作了。
6 客户端的配置
简单起见,我们修改tomcat自带的例子servlets-examples,使用户打开servlets-examples时要求用户进行单点登陆。具体操作如下:
修改tomcat\webapps\servlets-examples \WEB-INF\web.xml文件,添加以下内容:
<filter-name>CAS Filter</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://localhost:8443/cas/login</param-value>
</init-param>
<init-param>
<param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name>
<param-value>https://localhost:8443/cas/serviceValidate</param-value>
</init-param>
<init-param>
<param-name>edu.yale.its.tp.cas.client.filter.serverName</param-name>
<param-value>localhost:8080</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
将cas-client-java-2.1.1\dist\casclient.jar复制到
tomcat\webapps\servlets-examples \WEB-INF\lib下面,重新启动tomcat。
在浏览器中打开http://localhost:8080/servlets-examples/,此时会提示你是否接受证书,接受后出现登陆页面,输入任意的用户名,密码和用户名长度相同,你可以看到登陆成功后自动调转到servlets-examples应用。到此就大功告成了。7 使用CAS的taglib在web.xml中加入以下内容: <context-param> <param-name>edu.yale.its.tp.cas.serverName</param-name> <param-value>localhost:8084</param-value> </context-param>退出页面logout.jsp内容如下:<%@page contentType="text/HTML"%><%@page pageEncoding="UTF-8"%><%@ taglib uri="http://www.yale.edu/its/tp/cas/version2" prefix="cas"%><%session.invalidate();%><cas:logout logoutUrl="https://localhost:8443/cas/logout" var="a"/>要求鉴权的代码如下:<%@page contentType="text/html"%><%@page pageEncoding="UTF-8"%><%@ taglib uri="http://www.yale.edu/its/tp/cas/version2" prefix="cas"%><cas:auth var="netID" scope="session"> <cas:loginUrl>https://localhost:8443/cas/login</cas:loginUrl> <cas:validateUrl>https://localhost:8443/cas/serviceValidate</cas:validateUrl> <cas:authorizedProxy>https://localhost:8443/cas/proxyValidate</cas:authorizedProxy> <cas:service>http://localhost:8084/sso3/hello.jsp</cas:service></cas:auth> |
|