cas+tomcat开发单点登录教程(定制认证方式篇)
CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法。CAS 包含两个部分: CAS Server 和 CAS Client。CAS Server 需要独立部署,主要负责对用户的认证工作;CAS Client 负责处理对客户端受保护资源的访问请求,需要登录时,重定向到 CAS Server。如附件“cas原理.jpg”所示。
CAS Client 与受保护的应用部署在一起,以 Filter 方式保护受保护的资源。对于访问受保护资源的每个 Web 请求,CAS Client 会分析该Http 请求中是否包含 Service Ticket,如果没有,则说明当前用户尚未登录,于是将请求重定向到指定的 CAS Server 登录地址,并传递要访问的目的资源地址,以便登录成功过后重定向到该地址。用户在输入认证信息后,如果登录成功,CAS Server 随机产生一个 Service Ticket,并缓存该Service Ticket以待将来验证,之后系统自动重定向到 Service 所在地址,并为客户端浏览器设置一个 Ticket Granted Cookie(TGC),CAS Client 在拿到 Service 和新产生的 Ticket 过后,在第 5,6 步中与 CAS Server 进行身份合适,以确保 Service Ticket 的合法性。
?
以下内容基于CAS Client与CAS Server的交互采用SSL协议。
?
1.环境:JDK1.6+Tomcat6.0.32+cas-Server3.4.31+cas-Client3.1.12
?
2.利用JDK的keytool生成证书
?
在生产环境中,证书需要到证书提供商处购买。
正确设置%JAVA_HOME%,在DOS窗口下运行以下命令:keytool -genkey -alias wsria -keyalg RSA -keystore E:/sso/keys/dcssokey 如附件“生成证书截图.jpg”所示。这样在 E:/sso/keys目录下就会生成dcssokey的文件。
?
3.设置域名
cas建议用域名访问而不用IP地址访问,所以要设置一下域名,在C:\Windows\System32\drivers\etc下修改hosts文件,加入:(IP)10.5.227.125sso.unifyaa.com(不要用127.0.0.1)
?
4.导出证书
利用keytool命令导出证书,如附件“导出证书.jpg”所示。这样在 E:/sso/keys目录下就会生成dcsso.crt的文件。
?
5.为JVM导入证书
利用keytool名利为JVM导入证书,导入之前先确定%JAVA_HOME%\jre\lib\security目录下是否存在cacerts的文件,如果存在则删除该文件,利用keytool命令为JVM导入证书,如附件“JVM导入证书.jpg”所示。
?
6.web服务器应用证书
?
修改%TOMCCAT_HOME%/conf/server.xml文件,
? <!-- 启用HTTPS协议 -->
? ? <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
? ? ? ? ? ? ? ?maxThreads="150" scheme="https" secure="true"
? ? ? ? ? ? ? ?clientAuth="false" sslProtocol="TLS"
? ? ? keystoreFile="E:/sso/keys/dcssokey" keystorePass="dcfs00"
? ? ? truststoreFile="D:/ProgramFiles/Java/jdk1.6.0_25/jre/lib/security/cacerts" />
启动tomcat,在浏览器输入地址:https://sso.unify.com:8443 就会提示证书安全问题,点击“继续浏览”就可进入tomcat目录。
?
7.部署CAS Server应用
?
解压下载的cas-server-3.4.3.1.zip包,在cas-server-3.4.3.1\modules目录下找到cas-server-webapp-3.4.3.1.war文件,把该文件拷贝至%TOMCAT_HOME%\webapps下,并改名为cas.war,
重启tomcat,在浏览器输入https://sso.unifyaa.com:8443/cas/login 弹出cas的登录界面,如附件“cas登录界面.jpg”所示。
在登录界面输入admin/admin,登录成功,如附件“cas登录成功界面.jpg”所示。
注:在CAS Server中,默认使用org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler类作登录身份认证处理,这个不适用生产环境,我们需要使用定制化的AuthenticationHandler。
?
8.定制CAS Server的用户身份认证接口
CAS 提供扩展认证的核心是 AuthenticationHandler 接口。CAS还提供了AuthenticationHandler?接口的一些抽象实现,以满足我们的复杂应用,如:AbstractPreAndPostProcessingAuthenticationHandler,可在身份认证前后做一些操作。对于最常用的用户名/密码认证方式,CAS也提供了支持,由类AbstractUsernamePasswordAuthenticationHandler提供支持。
通常用户信息一般都存在于数据库,我们通过JDBC的方式来验证用户信息。CAS提供了通过JDBC连接数据库认证用户的默认实现,需要/cas-server-3.4.3.1/modules/cas-server-support-jdbc-3.4.3.1.jar包的支持。把该包
copy到tomcat的webapps下的cas.war的WEB-INF/lib下。
增加dataSource。在tomcat的/webapps/cas/WEB-INF/deployerConfigContext.xml添加以下内容:
?
?
?以上用的是c3p0作为dataSource的实现,dataSource的作用大家都比较清楚,这里就不做解释了。
在tomcat的\webapps\cas\WEB-INF目录下新建两个文件,分别是jdbc.properties和c3p0.properties,内容如下:
jdbc.properties
?
?
?添加以下内容:
?
?
我们可以使用QueryDatabaseAuthenticationHandler,也可以使用SearchModeSearchDatabaseAuthenticationHandler,使用SearchModeSearchDatabaseAuthenticationHandler的配置如下:
?
?
?由于我们的密码一般都是经过加密的,所以在认证信息的时候需要对用户提交的密码进行加密,CAS提供了MD5加密的默认实现,配置如下:
?
?然后在mysql数据库中新建一张表:loginUsers,字段为loginname和password,并新增一条记录,启动tomcat,在浏览器输入https://sso.unify.com:8443/cas/login,会提示证书错误,点击继续浏览就可以了,在登录界面输入新建记录的用户名和密码,就可以登录成功了。
?
附:
若CAS Server与CAS Client的交互不想使用SSL协议,则注释掉%TOMCAT_HOME%\conf\server.xml文件中的这段内容:
?在%TOMCAT_HOME%\webapps\cas\WEB-INF\deployerConfigContext.xml文件中找到如下内容:
?在/>前加上如下内容:p:requireSecure="false",表示不需要安全协议。
接着在%TOMCAT_HOME%\webapps\cas\WEB-INF\spring-configuration目录下修改ticketGrantingTicketCookieGenerator.xml文件,修改后的内容如下:
?p:cookieSecure="false",表示cookie也不需要安全协议,p:cookieMaxAge设置cookie的有效时长。
重启tomcat,在浏览器输入http://sso.unifyaa.com:8080/cas/login 就可以访问了。