• 1. Spring security3 整合CAS
  • 2. 一CAS介绍1、CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目。CAS 具有以下特点: 2、开源的企业级单点登录解决方案。 3、CAS Server 为需要独立部署的 Web 应用。 4、CAS Client 支持非常多的客户端(这里指单点登录系统中的各个 Web 应用),包括 Java, .Net, PHP, Perl, Apache, uPortal, Ruby 等。
  • 3. 二CAS原理及协议从结构上看,CAS 包含两个部分: CAS Server 和 CAS Client。CAS Server 需要独立部署,主要负责对用户的认证工作;CAS Client 负责处理对客户端受保护资源的访问请求,需要登录时,重定向到 CAS Server。下图是 CAS 最基本的协议
  • 4. 1、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 的合法性。 2、在该协议中,所有与 CAS 的交互均采用 SSL 协议,确保,ST 和 TGC 的安全性。协议工作过程中会有 2 次重定向的过程,但是 CAS Client 与 CAS Server 之间进行 Ticket 验证的过程对于用户是透明的
  • 5. 三 https 配置1、生成 server key 进入cmd转到E:\下输入 keytool -genkey -alias casserver -keyalg RSA -keypass changeit -storepass changeit -keystore server.keystore -validity 3600 注:参数 -validity 指证书的有效期(天),缺省有效期很短,只有90天。 生成证书时,您的名字与姓氏是什么,必须添域名或cas server机器名,否则SSL将不能取得TGC信息。(证书至关重要,直接影响CAS是否能正常工作) RSA 生成证书的方式 Changeit 证书密码
  • 6. 2、将证书导入到JDK的证书信任库中 第一步是导出证书,命令如下: keytool -export -trustcacerts -alias casserver -file server.cer -keystore server.keystore -storepass changeit 第二步是导入到证书信任库,命令如下: keytool -import -trustcacerts -alias casserver -file server.cer -keystore D:\Java\jre1.6.0_02\lib\security\cacerts -storepass changeit 注:根据不同的JDK版本证书需要导入jdk/jre中。
  • 7. 四 cas-server 配置1、配置服务端tomcate   keystoreFile为已经生成的服务器证书的地址 keystorePass为自定义的服务器证书的密码
  • 8. 2、部署CAS Server    到CAS网站上下载server程序,将cas-server-webapp-<版本号>.war 拷贝到 tomcat的 webapps 目录,并更名为 cas.war。由于前面已配置好 tomcat 的 https 协议,可以重新启动 tomcat,然后访问:https://localhost:8443/cas ,如果能出现正常的 CAS 登录页面,则说明 CAS Server 已经部署成功。 3、此时cas-server 端默认的账号验证方式为用户名与密码相同即可,若需改为连接数据库形式则需 1)修改cas/WEB-INF/deployerConfigContext.xml     添加DataSource …… …… …… …… 2)替换AuthenticationHandler   注释掉原来的    
  • 9. (自定义加密方式 ,此时需增加加mypasswordEncoder bean)
  • 10. 此类默认支持MD5 与SHA1两种加密方式,若不满足需求则可自定义加密方式,需实现PasswordEncoder 接口 4)cas 取消https验证配置 4.1、修改cas server下\WEB-INF\deployerConfigContext.xml文件 增加参数p:requireSecure="false",是否需要安全验证,即HTTPS,false为不采用。 4.2 、修改cas server下 WEB-INF\springconfiguration\ticketGrantingTicketCookieGenerator.xml文件
  • 11. 参数p:cookieSecure="true",TRUE为采用HTTPS验证,与deployerConfigContext.xml的参数保持一致。 参数p:cookieMaxAge="-1",简单说是COOKIE的最大生命周期,-1为无生命周期,即只在当前打开的IE窗口有效,IE关闭或重新打开其它窗口,仍会要求验证。可以根据需要修改为大于0的数字,比如3600等,意思是在3600秒内,打开任意IE窗口,都不需要验证。 修改cas server下\WEB-INF\spring-configuration\warnCookieGenerator.xml文件 两个参数与上面同理。
  • 12. 5 返回更多用户信息 1 注释掉 bean 重新配置attributeRepository
  • 13. 同时在VIEW-INF/jsp/protocal/2.0/casServiceValidationSuccess.jsp中增加 ${fn:escapeXml(attr.value)} 在server验证成功后,这个页面负责生成与客户端交互的xml信息,在默认的casServiceValidationSuccess.jsp中,只包括用户名,并不提供其他的属性信息,因此需要对页面进行扩展,以上为新添加部分 客户端获取: AttributePrincipal principal = (AttributePrincipal) request.getUserPrincipal(); Map attributes = principal.getAttributes(); String name=attributes .get(“name");
  • 14. 四 cas-client配置1、导入服务端生成证书 复制cas服务端生成证书server.cer 到客户端,将证书导入JDK中 keytool -import -trustcacerts -alias casserver -file server.cer -keystore D:\Java\jre1.6.0_02\lib\security\cacerts -storepass changeit 注 此处的jre必须为JDK路劲下的jre 2、在基于spring security 项目中加入 cas相应的依赖jar包
  • 15. 3 设置相应的切入点与filter …………. casEntryPoint 定义为 声明cas服务器端登录的地址,此处写IP或主机名均可 不使用http的自动配置。 *entry-point-ref="casEntryPoint"作用是认证的入口,是一个实现 AuthenticationEntryPoint接口的类。为ExceptionTranslationFilter类提供认证依据。 使用自定义的Filter,放置在过滤器链的CAS_FILTER的位置
  • 16. serviceProperties 为认证成功后服务端返回的地址. 该地址将作为参数传递到服务端 此处不能写为IP 的形式。需写为主机名(证书生成时写的计算机全名)或域名 sendRenew 为boolean类型 当为true时每新打开窗口则需重新登录 casFilter 配置如下:    为cas的过滤器当server返回Ticket后 client 需再次将ticket发送到server进行校验,此处可配置成功的Handler与失败的Handler
  • 17.                                  
  • 18.       
  • 19. Cas 单点注销 Filter 为 requestSingleLogoutFilter, singleLogoutFilter          
  • 20. filterProcessesUrl 为注销的filter触发的链接 退出后显示登录页面,并且登录成功后还是会进入到之前的业务系统,那么可以修改cas-servlet.xml文件,在“logoutController”的bean配置中增加属性“followServiceRedirects”,设置为“true”,然后在业务系统的注销连接中加入“service参数”,值为业务系统的绝对URL如: https://190.100.100.56:8443/cas/logout?service=http://190.100.100.56:8002/boda/signin.jsp 如果Client要注销,需在Client先注销,之后让Server注销提供的ticket。 如果不这样,不论是只注销Client还是Server,注销后,系统仍然还是可以访问的 注销所连接的url需与login时写的url一致,及要么都是Ip、域名或本地时的主机名,两个链接应对应,否则在注销时服务端无法找到cookie进行注销