Spring security+CAS单点登录
Spring security 版本 3.2.4
CAS Server版本 3.4.10
CAS client 版本 3.2.1
JDK 1.7
Tomcat 8.0
原理:
从结构上看,CAS 包含两个部分: CAS Server 和 CAS Client。CAS Server 需要独立部署,主要负责对用户的认证工作;CAS Client 负责处理对客户端受保护资源的访问请求,需要登录时,重定向到 CAS Server。图1 是 CAS 最基本的协议过程:
图 1. CAS 基础协议
CAS Client 与受保护的客户端应用部署在一起,以 Filter 方式保护受保护的资源。对于访问受保护资源的每个 Web 请求,CAS Client 会分析该请求的 Http 请求中是否包含 Service Ticket,如果没有,则说明当前用户尚未登录,于是将请求重定向到指定好的 CAS Server 登录地址,并传递 Service (也就是要访问的目的资源地址),以便登录成功过后转回该地址。用户在第 3 步中输入认证信息,如果登录成功,CAS Server 随机产生一个相当长度、唯一、不可伪造的 Service Ticket,并缓存以待将来验证,之后系统自动重定向到 Service 所在地址,并为客户端浏览器设置一个 Ticket Granted Cookie(TGC),CAS Client 在拿到 Service 和新产生的 Ticket 过后,在第 5,6 步中与 CAS Server 进行身份合适,以确保 Service Ticket 的合法性。
在该协议中,所有与 CAS 的交互均采用 SSL 协议,确保ST 和 TGC 的安全性。协议工作过程中会有 2 次重定向的过程,但是 CAS Client 与 CAS Server 之间进行 Ticket 验证的过程对于用户是透明的。
另外,CAS 协议中还提供了 Proxy (代理)模式,以适应更加高级、复杂的应用场景,具体介绍可以参考 CAS 官方网站上的相关文档。
配置tomcat https
本例是将CAS server 和 CAS client部署在不同的tomcat 上,首先需要为客户端和服务端的tomcat配置https协议:
SSL文件准备:
server.keystore——服务器端库文件
client.keystore——客户端库文件
server.cer——服务器端证书(自制)
client.cer——客户端证书(自制)
cacerts——证书链
1、生成服务器端库文件
keytool -genkey -v -alias server -keyalg RSA -keystore F:\server.keystore -validity 36500
(输入密码,并输入你的名字和姓氏,组织名称,地区名称等,注意在填入 你的名字和姓氏CN的时候输入localhost)
2、导出服务器端证书
keytool -export -alias server -storepass 密码 -file F:\server.cer -keystore F:\server.keystore
3、生成客户端库文件
keytool -genkey -v -alias client -keyalg RSA -keystore F:\client.keystore -validity 36500
(输入密码,并输入你的名字和姓氏,组织名称,地区名称等,注意在填入 你的名字和姓氏CN的时候输入localhost)
4、导出客户端证书
keytool -export -alias client -storepass 密码 -file F:\client.cer -keystore F:\client.keystore
5、导入服务器端证书到cacerts(cacerts是JDK下的jre的可信任证书仓库)
keytool -import -trustcacerts -alias server -file F:\server.cer -keystore ”%JAVA_HOME%\jre\lib\security\cacerts” -storepass changeit
6、
6、导入客户端证书到cacerts(cacerts是JDK下的jre的可信任证书仓库)
keytool -import -trustcacerts -alias server -file F:\server.cer -keystore ”%JAVA_HOME%\jre\lib\security\cacerts” -storepass changeit
将server.keystore、client.keystore、server.cer、client.cer、cacerts文件复制到cas服务器、cas客户机、cas客户机1的TOMCAT_HOME主目录及JAVA_HOEM\jre\lib\security目录下。
分别修改CAS server 和 CAS client的tomcat中的 conf/server.xml
修改CAS server的tomcat以下端口:
<Connector useBodyEncodingForURI="true" URIEncoding="UTF-8" connectionTimeout="20000" port="8089" protocol="HTTP/1.1" redirectPort="8443"/>
<Connector useBodyEncodingForURI="true" URIEncoding="UTF-8" SSLEnabled="true" acceptCount="100" clientAuth="false"
disableUploadTimeout="true" enableLookups="true"
keystoreFile="/server.keystore" keystorePass="wentao211()"
maxSpareThreads="75" maxThreads="200" minSpareThreads="5" port="8443"
protocol="org.apache.coyote.http11.Http11Protocol" scheme="https" secure="true"
sslProtocol="TLS"/>
<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="8019" protocol="AJP/1.3" redirectPort="8443"/>
为了防止和CAS client的tomcat端口冲突,我将端口修改
修改CAS client的tomcat的端口:
<Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8088" protocol="HTTP/1.1" redirectPort="8445" useBodyEncodingForURI="true"/>
<Connector SSLEnabled="true" URIEncoding="UTF-8" acceptCount="100" clientAuth="false" disableUploadTimeout="true" enableLookups="true" keystoreFile="/client.keystore" keystorePass="wentao211()" maxSpareThreads="75" maxThreads="200" minSpareThreads="5" port="8445" protocol="org.apache.coyote.http11.Http11Protocol" scheme="https" secure="true" sslProtocol="TLS" useBodyEncodingForURI="true"/>
<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8445"/>
配置CAS Server
将下载的cas-server-3.4.10-release.zip 解压,把cas-server-3.4.10/modules下面的
cas-server-webapp-3.4.10.war拷贝到tomcat下的webapps下,然后启动tomcat;或者直接从myeclipse中导入war包,将其导入到myeclipse中,然后再发布到tomcat中,推荐使用后缀,因为我们需要继续对CAS server进行一些修改才能满足我们的需求:
1,我们需要使用数据源来对用户进行登陆验证,本例使用mysql作为数据库,所以需要拷贝一个mysql-connector-java-5.1.33-bin.jar和一个cas-server-support-jdbc-3.4.10.jar到lib下面,
并且需要在数据库中建立一个表,用来存放用户数据,当然表中的字段可以根据需要新增,其中的字段名也是可以修改,只是需要在配置
deployerConfigContext.xml的数据源中字段查询的时候跟其对应上
然后修改/WEB-INF/deployerConfigContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:sec="http://www.springframework.org/schema/security"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd">
<bean id="authenticationManager" class="org.jasig.cas.authentication.AuthenticationManagerImpl">
<property name="credentialsToPrincipalResolvers">
<list>
<bean
class=