CAS学习
背景:wap调查和web的discuz用户属于两个不同的用户体系,为了方便用户的注册,所以,需要将两者的数据进行统一管理,于是单点登录cas出现在我们的面前。
Cas介绍:CAS(Central Authentication Service) 是 Yale 大学发起的一个开源项目。 从结构体系看, CAS 包含两部分:
1、 CAS Server CAS Server 负责完成对用户的认证工作, CAS Server 需要独立部署,有不止一种 CAS Server 的实现
2、 CAS client 负责部署在客户端,CAS Client 支持非常多的客户端,包括 Java 、 .Net 、 ISAPI 、 Php 、 Perl 、 uPortal 、 Acegi 、 Ruby 、 VBScript 等客户端,几乎可以这样说, CAS 协议能够适合任何语言编写的客户端应用
Cas 服务器端:版本:cas-server-3.3.1
开发步骤:
1.解压cas-server-3.3.1,进入modules中,解压cas-server-webapp-3.3.1,把名称改成cas,放入tomcat 的webapp中,运行tomcat,访问http://localhost:8080/cas/login 如果出现登录页面,用户名和密码填写相同则验证通过。此时你的cas服务器则配置成功。
2.服务器的登录不能这么简单,所以需要将登录和数据库中的数据进行结合。所以需要在cas服务器端配置数据库。配置过程如下:
1)打开cas\WEB-INF\deployerConfigContext.xml 文件。找到
1. <bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" /> 将其替换成
2. <bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
3. <property name="sql" value="select password from app_user where lower(username)=lower(?)"/>
4. <property name="dataSource">
5. <ref local="DateSource"/>
6. </property>
7. </bean>
然后需要配置 DateSource
8. <bean id="DateSource" class="org.apache.commons.dbcp.BasicDataSource">
9. <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
10. <property name="url" value="jdbc:mysql://localhost:3306/test"/>
11. <property name="username" value="root" />
12. <property name="password" value="123" />
13. <property name="maxActive" value="20"/>
14. <property name="maxIdle" value="20"/>
15. <property name="maxWait" value="20"/>
16. </bean>
说明:此处是连接的test数据库,然后使用的是app_user表。数据库使用的是mysql
所以需要添加额外的包进来:commons-dbcp-1.2.2.jar,commons-pool-1.4.jar,mysql-connector-java-5.0.0-beta-bin.jar,spring.jar 。
此时在运行cas,基本上就ok了。
3.cas需要加入安全证书。所以需要使用keytool生成证书导入到jvm中。
生成步骤:
1,生成数字证书
keytool -genkey -alias tomcatcas -keypass changeit -keyalg RSA -keystore tomcatcas keystore
2,导出数字证书
keytool -export -alias tomcatcas -keypass changeit -file server.crt -keystore tomcatcas.keystore
3,将数字证书导入jre的可信区
keytool -import -alias tomcatcas -file server.crt -keypass changeit -keystore ../jre/lib/security/cacerts
4.查看是否已经导入
keytool -list -keystore ../jre/lib/security/cacerts
5.keytool 参数说明
-genkey 在用户主目录中创建一个默认文件".keystore",还会产生一个mykey的别名,mykey中包含用户的公钥、私钥和证书
-alias 产生别名
-keystore 指定密钥库的名称(产生的各类信息将不在.keystore文件中
-keyalg 指定密钥的算法
-validity 指定创建的证书有效期多少天
-keysize 指定密钥长度
-storepass 指定密钥库的密码
-keypass 指定别名条目的密码
-dname 指定证书拥有者信息例如: "CN=firstName,OU=org,O=bj,L=bj,ST=gd,C=cn"
-list 显示密钥库中的证书信息 keytool -list -v -keystore 别名 -storepass ....
-v 显示密钥库中的证书详细信息
-export 将别名指定的证书导出到文件 keytool -export -alias 别名 -file 文件名.crt
-file 参数指定导出到文件的文件名
-delete 删除密钥库中某条目 keytool -delete -alias 别名 -keystore sage
-keypasswd 修改密钥库中指定条目口令 keytool -keypasswd -alias 别名 -keypass .... -new .... -storepass ... -keystore 别名
-import 将已签名数字证书导入密钥库 keytool -import -alias 别名 -keystore 证书名-file 文件名(可以加.crt 后缀)
配置tomcat:
打开tomcat/conf/server.xml,找到8443,改成如下配置
Xml代码
17. <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
18. maxThreads="150" scheme="https" secure="true"
19. clientAuth="false" sslProtocol="TLS"
20. keystoreFile="D:\Program Files\Java\jre6\lib\security\tomcatcas.keystore"
21. keystorePass="changeit"
22. truststoreFile="D:\Program Files\Java\jre6\lib\security\cacerts"
23. truststorePass="changeit"
24. />
以上就是配置了一个完整的cas服务器。Cas登录都是跳到统一的登录页面,cas不支持客户端远程登录,所以需要修改cas的代码让其支持客户端登录:
支持客户端登录步骤:
1.修改cas/WEB-INF/web.xml,为cas增加一个/remoteLogin的映射:
25. <servlet-mapping>
<servlet-name>cas</servlet-name>
<url-pattern>/remoteLogin</url-pattern>
26. </servlet-mapping>
2.然后修改cas/cas-servlet.xml文件,增加我们对/remoteLogin映射的处理,需要增加一个新流程:
找到<prop key="/login">loginController</prop> 在后面加上
27. <prop key="/remoteLogin">remoteLoginController</prop>
3.然后在cas-servlet.xml文件中添加我们上面所配置的remoteController的bean:
<!-- 增加远程控制者,允许以/remote请求启动remote控制流程 -->
<bean id="remoteLoginController"
class="org.springframework.webflow.executor.mvc.FlowController"
p:flowExecutor-ref="remoteLoginFlowExecutor"
p:defaultFlowId="remoteLogin-webflow">
<property name="argumentHandler">
<bean class="org.springframework.webflow.executor.support.RequestParameterFlowExecutorArgumentHandler"
p:flowExecutionKeyArgumentName="lt"
p:defaultFlowId="remoteLogin-webflow" />
</property>
</bean>
<flow:executor id="remoteLoginFlowExecutor" registry-ref="remoteLoginFlowRegistry">
<flow:execution-attributes>
<flow:alwaysRedirectOnPause value="false"/>
</flow:execution-attributes>
</flow:executor>
<flow:registry id="remoteLoginFlowRegistry">
<flow:location path="/WEB-INF/remoteLogin-webflow.xml"/>
</flow:registry>
4.可以看到上面将请求指向了webflow配置文件/WEB-INF/remoteLogin-webflow.xml文件,我们需要创建此文件并配置其成为我们所需的流程,根据原login-webflow.xml文件修改,修改文件见附件。可以看到,我们在流程中增加了remoteLogin Action节点和remoteCallback View节点
5.下面我们配置remoteLogin节点:
在/WEB-INF/cas-servlet.xml文件中增加remoteLoginAction配置:
<bean id="remoteLoginAction"
class="com.ttpod.cas.web.flow.RemoteLoginAction"
p:argumentExtractors-ref="argumentExtractors"
p:warnCookieGenerator-ref="warnCookieGenerator"
p:ticketGrantingTicketCookieGenerator-ref="ticketGrantingTicketCookieGenerator" />
同时创建com.ttpod.cas.web.flow.RemoteLoginAction类:见附件
6.修改cas\WEB-INF\classes\default_views.properties文件,增加remoteCallbackView配置:
### 配置远程回调页面
remoteCallbackView.(class)=org.springframework.web.servlet.view.JstlView
remoteCallbackView.url=/WEB-INF/view/jsp/default/ui/remoteCallbackView.jsp
7.创建/WEB-INF/view/jsp/default/ui/remoteCallbackView.jsp文件:
详情见附件
至此cas服务器配置已经告一段落,下面是让java客户端支持支持cas服务器
Cas java客户端:版本:3.1.3
开发步骤在web.xml中加入
<!--单点退出配置 一定要放在前面-->
28. <filter>
29. <filter-name>CAS Single Sign Out Filter</filter-name>
30. <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
31. </filter>
<!--单点登录配置-->
32. <filter-mapping>
33. <filter-name>CAS Single Sign Out Filter</filter-name>
34. <url-pattern>/*</url-pattern>
35. </filter-mapping>
36.
37. <filter>
38. <filter-name>CAS Authentication Filter</filter-name>
39. <!--<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>-->
40. <filter-class>com.ttpod.bbs.com.view.filter.RemoteAuthenticationFilter</filter-class>
41. <!-- 配置客户单登录 配置你的登录页面-->
42. <init-param>
43. <param-name>localLoginUrl</param-name>
44. <param-value>http://192.168.1.2:8080/ttpodbbs/head/login.jsp
45. </param-value>
46. </init-param>
47. <!-- CAS login 服务地址-->
48. <init-param>
49. <param-name>casServerLoginUrl</param-name>
50. <param-value>https://192.168.1.2:8443/cas/login</param-value>
51. </init-param>
52. <init-param>
53. <param-name>renew</param-name>
54. <param-value>false</param-value>
55. </init-param>
56. <init-param>
57. <param-name>gateway</param-name>
58. <param-value>false</param-value>
59. </init-param>
60. <!-- 客户端应用服务地址-->
61. <init-param>
62. <param-name>serverName</param-name>
63. <param-value>http://192.168.1.2:8080</param-value>
64. </init-param>
65. </filter>
66. <!--负责Ticket校验-->
67. <filter>
68. <filter-name>CAS Validation Filter</filter-name>
69. <filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
70. <init-param>
71. <param-name>casServerUrlPrefix</param-name>
72.
评论
这个是3年前用的,现在都快忘记了