目的:使用单点登录系统统一管理各子系统的用户登录登出,并提供一个统一的集成页面,方便用户在各系统之间的快速切换。
环境:cas-server-3.3.1,cas-client-2.0.11
一:为Tomcat配置SSL安全协议
SUN公司提供了制作证书的工具keytool。在JDK1.4以上版本中都包含了这一工具。通过这个工具生成证书的命令为:
keytool-genkey -alias tomcat -keyalg RSA -validity 365
以上命令将生成包含一对非对称密钥和自我签名的证书,这个命令中参数的意思
-genkey:生成一对非对称密钥。
-alias:指定密钥对的别名,该别名是公开的。
-keyalg:指定加密算法,此处采用通用的RSA算法。
以上命令将在操作系统的用户目录下生成名为”.keystore”的文件。
如果希望生成的keystore文件放在其他目录中,可以使用-keystore参数
keytool-genkey -alias tomcat -keyalg RSA -keystore d:\.keystore
1.2 keytool -export -alias tomcat -keystore tomcat -file tomcat.crt 这一步是把密钥库导出为证书文件。 注意:密码为上一步设定的密码。
1.3keytool -import -alias tomcat -file tomcat.crt -keystore "%JAVA_HOME%\jre\lib\security\cacerts" 这一步是把证书导入TOMCAT。
后面的路径为TOMCAT使用的JRE路径,JDK1.6安装有两个目录JDK1.6和JRE1.6,TOMCAT6.0只要JRE1.6即可,通常在安装时,也都是默认到JRE1.6,这时要输入%JRE_HOME%/lib/security/cacerts,这个地方必须要确认准确。注意:这里需要输入密码,此密码不是前面设定的密码,是系统默认的密码changeit
2.使用keytool的注意事项
1. 默认情况下.keystore文件存放在 [用户目录下]
2. 在执行keytool命令式可以使用-keystore参数指定.keystore文件的生成目录
3. 名字与姓名要输入主机名或者域名,如so.example.com或者localhost.密码默认为changeit,下面的密码直接按回车即可
3.Tomcat 配置 ssl 连接器
1. 在Tomcat的【catalina_path】\conf\server.xml文件中,已经提供了现成的配置SSL连接器的代码,只要把注释去掉即可
<Connector port="8443" protocol="HTTP/1.1"SSLEnabled="true"
maxThreads="150" scheme="https"secure="true"
clientAuth="false" sslProtocol="TLS" />
2.Connector其他属性:
keystoreFile:指定keystore文件的存放位置,可以指定绝对路经。如果此项没有设定,在默认情况下,Tomcat将从当前操作系统用户的用户名目录下读取名为”.keystore”的文件。
keystorePass:指定keystore的密码,如果此项没有设定,在默认情况下,Tomcat将使用”changeit”密码。
3.使用SSL协议访问Tomcat .在浏览器中中输入https://localhost:8443/
二:部署CAS Server
CAS Server 是一个 Web 应用包,将前面下载的 cas-server-3.1.1-release.zip 解开,把其中的 cas-server-webapp-3.1.1.war 拷贝到 tomcat的 webapps 目录,并更名为 cas.war。由于前面已配置好 tomcat 的 https 协议,可以重新启动 tomcat,然后访问:https://localhost:8443/cas ,如果能出现正常的 CAS 登录页面,则说明 CAS Server 已经部署成功。
一.cas配置mysql
对于CAS Server的cas.war中默认的认证Handler是SimpleTestUsernamePasswordAuthenticationHandler,该方式只要输入的用户名和密码相同就能通过验证,因此需要更改设置,常见的有数据库,xml文件,ldap方式。下面讲述数据库和ldap两种方式。
在CAS Server中webapp下的cas中配置文件deployerConfigContext.xml,把上述的简单认证注释掉,在其下面加入数据库handler,如下:
<bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"><property name="sql" value="select password from app_user where username=?" />
<property name="dataSource" ref="dataSource" />
<property name="passwordEncoder" ref="passwordEncoder"/> <!--当数据库采用MD5加密方式的时候需要添加这一句-->
</bean>
</bean>上述配置还是用到了dataSource和passwordEncoder,因此需要加入以下配置,位置只要在<beans>下就行:
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName"><value>com.mysql.jdbc.Driver</value></property>
<property name="url"><value>jdbc:mysql://localhost:3306/cas3</value></property>
<property name="username"><value>root</value></property>
<property name="password"><value>1234</value></property>
</bean>
如果数据库中的密码采取MD5散列的话,加入passwordEncoder属性
<bean id="MD5PasswordEncoder" class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder">
<constructor-arg index="0">
<value>MD5</value>
</constructor-arg>
</bean>
然后在cas中的webapp下lib的库加入,数据库连接驱动和包支持,mysql-connector-java-5.1.18-bin.jar和cas-server-support-jdbc-3.5.1.jar。
对于我的程序来说,访问测试web应用http://qinshang-PC:8443/cas-sql/login 然后输入数据库中的密码就可以正常查看了
CAS返回附加属性给客户端
1:修改attributeRepository属性,注释掉原本的这个bean,重新定义如下的bean:
<bean id="attributeRepository" class="org.jasig.services.persondir.support.jdbc.SingleRowJdbcPersonAttributeDao">
<constructor-arg index="0" ref="dataSource" />
<constructor-arg index="1" value="SELECT * FROM app_user WHERE {0}" />
<property name="queryAttributeMapping">
<map>
<entry key="username" value="username" />
</map>
</property>
<property name="resultAttributeMapping">
<map>
<entry key="username" value="username" />
<entry key="company" value="company" />
<entry key="email" value="email" />
</map>
</property>
</bean>
2:修改名称为serviceRegistryDao的bean,在list中选择针对自己选择的方式添加属性,我这里选择的是http://**类型,然后添加了需要额外查询的属性名
<property name="allowedAttributes">
<list>
<value>company</value>
<value>email</value>
</list>
</property>
PS:网上有很多博客说是要注释掉这个bean下的属性,不然客户端还是接收不到附加属性,但是我这样尝试后,发现连cas的认证界面都登入不上去,这里真心感谢http://01jiangwei01.iteye.com/blog/1434200该篇博客的指导,不然我估计我再照以前那方法花个三天还是配不好这个问题!
3:修改WEB-INF\view\jsp\protocol\2.0\casServiceValidationSuccess.jsp文件,增加以下代码,不然客户端还是会接收不到附加属性:
<c:if
test="${fn:length(assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes) > 0}">
<cas:attributes>
<c:forEach
var="attr"
items="${assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes}"
varStatus="loopStatus"
begin="0"
end="${fn:length(assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes)-1}"
step="1">
<cas: ${fn:escapeXml(attr.key)}>${fn:escapeXml(attr.value)}</cas: ${fn:escapeXml(attr.key)}>
</c:forEach>
</cas:attributes>
</c:if>
好了,大功告成,打开浏览器,测试一下吧!
二.cas配置ldap
对于LDAP来讲,同样是改变deployerConfigContext.xml,加入LDAP的handler,如下:
<bean class="org.jasig.cas.adaptors.ldap.BindLdapAuthenticationHandler">
<property name="filter" value="uid=%u" />
<!-- 基节点 -->
<property name="searchBase" value="ou=accounts,dc=lab,dc=kernelogic,dc=ca" />
<property name="contextSource" ref="contextSource" />
</bean>
还要在其他位置加入contextSource的配置:
<bean id="contextSource" class="org.springframework.ldap.core.support.LdapContextSource">
<property name="anonymousReadOnly" value="false" />
<property name="pooled" value="true" />
<property name="urls">
<list>
<value>ldap://lab.kernelogic.ca/</value>
</list>
</property>
<!-- 如果是老版本,这里应该用的是userName,而不是userDn -->
<property name="userDn" value="cn=admin,dc=lab,dc=kernelogic,dc=ca" />
<property name="password" value="secret" />
<property name="baseEnvironmentProperties">
<map>
<entry>
<!--none 端口 389-->
<!--ssl 端口 636-->
<key><value>java.naming.security.protocol</value></key>
<value>none</value>
</entry>
<entry>
<key><value>java.naming.security.authentication</value></key>
<value>simple</value>
</entry>
</map>
</property>
</bean>
然后在cas 库中加入cas-server-support-ldap-3.5.1.jar ,spring-ldap的jar文件,应该就可以了,因为这个例子没有测试,所以先写在这儿,测试后如果有错误会更改!