环境:
1,CAS 4.0
2,eclipse
3,tomcat7.0.59
4,jdk1.7.0_17
一,简介
单点登录( Single Sign-On , 简称 SSO )是目前比较流行的服务于企业业务整合的解决方案之一, SSO 使得在多个应用系统中,用户只需要 登录一次 就可以访问所有相互信任的应用系统。
二,配置服务器和客户端
我们要站在巨人的肩膀上直接参照ITeye的一篇博文
http://liangjian103.iteye.com/blog/1129056
就是配置一个tomcat,放cas.war,然后修改些配置,启动就OK
(注意如果这里你要是本地起两个tomcat别忘了改端口,负责会冲突)。
但是生成证书不好用,证书下面再讲。注意这里配置tomcat
<Connector protocol="org.apache.coyote.http11.Http11NioProtocol"
port="8443" minSpareThreads="5" maxSpareThreads="75"
enableLookups="true" disableUploadTimeout="true"
acceptCount="100" maxThreads="200"
scheme="https" secure="true" SSLEnabled="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="keystore/server.keystore" keystorePass="changeit"
/>的时候,其中keystoreFile的路径改成下面第三部生成证书的路径,
我这里是keystoreFile="D:/keys/smallkey"
还有就是你的客户端(也就是你的一个服务应用)加入了filter之后会
缺少一个jar包,cas-client-2.0.11.zip里面java\lib\casclient.jar这个
包导入你的项目。
三,生成证书并导入客户端
还是不要重复造轮子参考CADN的一篇博文(看第一第二就ok啦)
http://blog.csdn.net/small_love/article/details/6664831
注意这里生成证书的时候,姓氏与名字,公司啥的都填写sso.tomcat.com。
区域啥的随便填。
导入证书到客户端(也就是你的一个服务应用)到jdk的时候,
这个jdk要是你服务用的jdk,并且文章中路径有问题
C:\>keytool -import -keystore C:\Java\jdk1.6.0_21\lib\security\cacerts -file D:/keys/small.crt -alias smalllove
其中jdk的路径是D:\javaSoft\jdk1.7.0_17\jre\lib\security\cacerts,
文章中路径少了一个jre,如果报错说cacerts有问题的话,直接删了就行,
然后再执行命令,自带的这个cacerts没有用。
好了,最后启动cas服务,再启动你的项目,访问以下你的项目,直接跳转到cas登录了吧,哈哈,祝你顺利。
四,配置自己的服务器用户登录
参照http://itindex.net/detail/51110-cas-4.0-%E7%99%BB%E5%BD%95的博文
参考第6,7,8,9都ok,卧槽,为啥没有第一次找到这个博文,就不用前面这么折腾了。
五,定制自己的单点登录系统
有个问题值得思考,我有好多子系统,一个cas服务器,我注册怎么实现?问题是cas没有注册机制,那么我们怎么实现安全又便捷的单点登录?
呵呵,查找了一些资料和文章,发现cas服务器可以配置多个数据源,也就是你把客户端的数据源都配置一遍,验证的时候Server端会根据你配置
的Client的数据库信息去读Client的数据库,如果其中任何一个通过了就算通过了。
以后用户注册,直接在你的客户端注册,对cas服务无任何影响。
下面就配置多数据源:
找到deployerConfigContext.xml这个文件,在bean id="authenticationManager"多加一个
<entry key-ref="dbAuthHandler2" value-ref="primaryPrincipalResolver"/>
然后在beans标签的下面加上以下两个数据源(注意,所加的这两个数据源必须是beans下面的第一个bean)
1. <bean id="dataSource1" class="org.springframework.jdbc.datasource.DriverManagerDataSource" destroy-method="close">
2. <property name="driverClassName"><value>com.mysql.jdbc.Driver</value></property>
3. <property name="url"><value>jdbc:mysql://192.168.1.244:3306/cas</value></property>
4. <property name="username"><value>root</value></property>
5. <property name="password"><value>root</value></property>
6. </bean>
7. <bean id="dataSource2" class="org.springframework.jdbc.datasource.DriverManagerDataSource" destroy-method="close">
8. <property name="driverClassName"><value>com.mysql.jdbc.Driver</value></property>
9. <property name="url"><value>jdbc:mysql://192.168.1.245:3306/cas1</value></property>
10. <property name="username"><value>root</value></property>
11. <property name="password"><value>root</value></property>
然后找到QueryDatabaseAuthenticationHandler,再拷贝一个dbAuthHandler,id改成dbAuthHandler2:如下
<!--验证密码-->
<bean id="dbAuthHandler"
class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"
p:dataSource-ref="dataSource"
p:passwordEncoder-ref="base64PasswordEncoder"
p:sql="select pwd from s_user where name=? and state='1' " />
<bean id="dbAuthHandler2"
class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"
p:dataSource-ref="dataSource2"
p:sql="select pwd from s_user where name=? and state='1' " />
这样就可以了(其中每个数据源都可以用自己独立的密码加密验证,修改passwordEncoder-ref的refer,自己编写具体密码加密类就可以了)
六,定制自己的密码加密校验方式
每个客户端都会有自己的加密方式,很多都不是简单的md5,sha1加密,这篇博文介绍了如何自定义自己的加密方式。
http://www.myexception.cn/software-architecture-design/1659294.html
就是自己写个加密类,然后把编译好的class文件放到jar包中,配置文件改成自己写的类的路径就ok了。
七,eclpse导入cas项目
上面第六步已经发现要导入cas项目了,要不修改源码确实麻烦。
(1),首先看一下百度文库的文章,简单导入一下cas项目
(2),发现上面导入的项目太简单,还改源码呢,连个蛋都改不了。好吧,下面再导入真能用到要修改的源码。
复制cas-server-core\src\main\java下的org文件包到你第(1)步建的cas项目src下。
复制cas-server-support-jdbc\src\main\java下的org文件包到你第(1)步建的cas项目src下。
我实际用到修改的就是这俩项目。
然后删除WEBINF/lib下的cas-server-core-4.0.0.jar和cas-server-support-jdbc-4.0.0.jar包(先删除你项目的classpath引用)。
然后现在cas项目就差不多是完整版了,想修改加密,还是想修改查询数据库,还是debug调试都可以了。