[学习] 使用 CAS 实现 SSO 实践过程

来源:互联网 发布:tableau是什么软件 编辑:程序博客网 时间:2024/05/29 21:18

  前一段时间曾经研究过一段关于 SSO 的技术,也深知 SSO(Single Sign-On) 是一个博大精深的主题,而我们通常提起的仅仅是所谓的 WebApp SSO,其主要特点是SSO 应用之间走Web协议 ( 如 HTTP/SSL) ,并且 SSO 都只有一个登录入口,SSO 的核心就是所谓的单点登录和身份认证。

  CAS(Central Authentication Service) 是 Yale 大学发起的一个开源项目,据统计,大概每 10 个采用开源构建 Web SSO 的 Java 项目,就有 8 个使用 CAS 。对这些统计,我虽然不以为然,但有一点可以肯定的是,CAS 是我认为最简单实效,而且足够安全的 SSO 选择。前一段时间正好做了配置 CAS 的实践,记下主要步骤,以供日后参考。

1.系统配置

以下是必需的软件环境:
1. JDK 1.4.2 or higher
2. Tomcat 5.X
3. JSSE-1_X(安装方法可见下载包)

2. Tomcat 配置,启用SSL

a. 在要安装CAS的机器上为Tomcat生成用于SSL通讯的密钥:%JAVA_HOME%/bin/keytool -genkey -alias tomcat -keyalg RSA
这时需要输入密钥密码和其他参数(第一个参数CN必须设置为CAS机器名,这里架设为 james-huang,本机使用localhost测试),会在系统用户目录中生成.keystore密钥文件。

b. 导出别名为tomcat的密钥文件:%JAVA_HOME%/bin/keytool -export -file /path/server.crt -alias tomcat 这时需要输入上一步设定的密码,结果会在/path/目录生成server.crt信任状。

c. 为客户端的JVM导入密钥::%JAVA_HOME%/bin/keytool -import -keystore $JAVA_HOME/jre/lib/security/cacerts -file /path/server.crt -alias tomcat 注意:输入密码时密码为"changeit",这是默认密码。

d. 修改服务端Tomcat配置文件,启用SSL:修改$CATALINA_HOME/conf/server.xml,去掉有关SSL的那一段的注释,需要在connector字段中加 keystorePass="password"(password即为1、2步中的密码),keystoreFile="keystorePath"(可以把第一步生成的.keystore复制到$CATALINA_HOME/conf/下,这样keystoreFile="conf/.keystore")。重启Tomcat,测试 https://james-huang:8443 是否可以访问(推荐将服务器填上Server的机器名)。

3. CAS Server安装

下载CAS Server 3.0.6(可到耶鲁大学官方站或者到 http://www.ja-sig.org/products/cas/ 下载),将其中的cas.war复制到$CATALINA_HOME/webapps下(当然现在CAS中的用户密码认证是很简陋的,产品化必须重写这部分代码,生成新的cas.war)。这时,重启Tomcat应该就可以通过访问 https://james-huang:8443/cas 看到CAS的登录界面了。

4. CAS Client 部署

建议自己创建一个Project以便进行试验(架设工程名为 casclient),下载最新版本的Yale Java CAS Client(2.0.11)并将casclient.jar复制到这两个项目的WEB-INF目录的lib下。修改两个项目的WEB-INF/web.xml,添加如下的过滤器:

代码:
<!-- CAS Filters --> 
<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://james-huang:8443/cas/login</param-value> 
</init-param><!--这里的james-huang是服务端的主机名--> 
<init-param> 
<param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name> 
<param-value>https://james-huang:8443/cas/proxyValidate</param-value> 
</init-param><!--这里的james-huang是服务端的主机名,而且必须是--> 
<init-param> 
<param-name>edu.yale.its.tp.cas.client.filter.serverName</param-name> 
<param-value>client:port</param-value><!--client:port就是需要CAS需要拦截的地址和端口,一般就是Client端的IP和port--> 
</init-param> 
</filter> 

<filter-mapping> 
<filter-name>CASFilter</filter-name> 
<url-pattern>/*</url-pattern> 
</filter-mapping> 
  这样,重启Client端的Tomcat并访问 http://client-ip:8080/casclient,你就会被重定向到Server端的CAS登陆页;此时你可测试登录(默认的认证Handler只要求username=password,可任意选择用户名);登录后就会进入casclient的欢迎页面了;继续定位到http://client-ip:8080/casclient,执行任何一个例子也不用再输入密码。

  至此,全部架设过程及测试完毕。当然,这仅仅是一个测试过程,若要实际环境中我们需要到数据库验证用户有效性,我们必须借助到用户数据库。首先,我们需要创建自己的数据库验证器,当然也可以使用Jasig提供的cas-server-jdbc.jar,通常我们会修改cas-server- jdbc的源码满足自己的需要,并把mysql的jdbc驱动和修改后的jar部署到%CAS%/WEB_INF/lib/下。具体的过程不在这里赘述,有兴趣的朋友可以自己研究一下。

5. 补充:1、在多台机器上部署CAS的时候要注意,这些部署的机器必须在同一个域中。2、若在配置过程中出现一些Exception,像“keytool 别名已存在”这些的出错提示,一般都是由于证书导入未成功造成的,若重新生成证书,导入到客户端的同时别忘了把server端的.keystore文件重新拷贝到Tomcat中去,石头就是由于忘记了这个步骤还调试了老半天呢:)

原创粉丝点击