• 1. 单点登录CAS分享
  • 2. 一 CAS介绍单点登录(Single Sign On):简称为 SSO,是目前比较流行的企业业务整 合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。 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. 从上面的视图可以看出,要实现SSO,需要以下主要的功能: 所有应用系统共享一个身份认证系统。 统一的认证系统是SSO的前提之一。认证系统的主要功能是将用户的登录信息和用户信息库相比较,对用户进行登录认证;认证成功后,认证系统应该生成统一的认证标志(ticket),返还给用户。另外,认证系统还应该对ticket进行效验,判断其有效性。 所有应用系统能够识别和提取ticket信息 要实现SSO的功能,让用户只登录一次,就必须让应用系统能够识别已经登录过的用户。应用系统应该能对ticket进行识别和提取,通过与认证系统的通讯,能自动判断当前用户是否登录过,从而完成单点登录的功能。
  • 6. 单一的用户信息数据库并不是必须的,有许多系统不能将所有的用户信息都集中存储,应该允许用户信息放置在不同的存储中,如下图所示。事实上,只要统一认证系统,统一ticket的产生和效验,无论用户信息存储在什么地方,都能实现单点登录。如下图所示
  • 7. 统一的认证系统并不是说只有单个的认证服务器,如下图所示,整个系统可以存在两个以上的认证服务器,这些服务器甚至可以是不同的产品。认证服务器 之间要通过标准的通讯协议,互相交换认证信息,就能完成更高级别的单点登录。如下图,当用户在访问应用系统1时,由第一个认证服务器进行认证后,得到由此 服务器产生的ticket。当他访问应用系统4的时候,认证服务器2能够识别此ticket是由第一个服务器产生的,通过认证服务器之间标准的通讯协议 (例如SAML)来交换认证信息,仍然能够完成SSO的功能。
  • 8. 三 支持https传输协议1、用 keytool生成证书: 命令 : keytool -genkey -alias casserver -keyalg RSA -keypass changeit - storepass changeit -keystore server.keystore -validity 3600 说明: 这里-alias casserver是表示生成的这个证书的别名叫casserver, -keyalg RSA 表示采用RSA算法 ,-keystore 指生成证书的位置 ,-validity 表示有效期(缺省为90天) 生成证书时,您的名字与姓氏是什么,必须添域名或cas server机器名,否则SSL将不能取得TGC信息。(证书至关重要,直接影响CAS是否能正常工作)如下图所示:
  • 9. 2、将证书导入到JDK的证书信任库中 第一步是导出证书,命令如下: keytool -export -trustcacerts -alias casserver -file server.cer -keystore server.keystore -storepass changeit 第二步(将证书导入的JDK的证书信任库中----导出证书): keytool -import -trustcacerts -alias casserver -file server.cer -keystore "%JAVA_HOME%\jre\lib\security\cacerts" -storepass changeit(密码) 注:根据不同的JDK版本证书需要导入jdk/jre中。
  • 10. 四 CAS—Server配置1、要采用https协议需修改服务端的Tomcate 的配置文件,(Tomcate安装路径下的conf/server.xml)即可启用ssl如下: 只需增加红色部分 keystoreFile为已经生成的服务器证书的地址 keystorePass为自定义的服务器证书的密码
  • 11. 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亦可取消https访问方式 3.1修改cas server下\WEB-INF\deployerConfigContext.xml文件 增加参数p:requireSecure="false",是否需要安全验证,即HTTPS,false为不采用。 3.2 、修改cas server下 WEB-INF\springconfiguration\ticketGrantingTicketCookieGenerator.xml文件 参数p:cookieSecure="true",TRUE为采用HTTPS验证,与deployerConfigContext.xml的参数保持一致。 参数p:cookieMaxAge=“-1”,简单说是COOKIE的最大生命周期,-1为无生命周期,即只在当前打开的IE窗口有效,IE关闭或重新打开其它窗口,仍会要求验证。可以根据需要修改为大于0的数字,比如3600等,意思是在3600秒内,打开任意IE窗口,都不需要验证。 3.3、修改cas server下\WEB-INF\spring-configuration\warnCookieGenerator.xml文件
  • 12. 4 配置与数据库的链接 cas-server 端默认的账号验证方式为用户名与密码相同即可,若需改为连接数据库形式则需 1)修改cas/WEB-INF/deployerConfigContext.xml     添加DataSource 2)替换AuthenticationHandler   注释掉原来的 认证方式     1 验证的方式可以采用sql 形式
  • 13. 2 指定表和字段 3 采用加密方式 (自定义加密方式 ,此时需增加加mypasswordEncoder bean) 此类默认支持MD5 与SHA1两种加密方式,若不满足需求则可自定义加密方式,需实现PasswordEncoder 接口
  • 14. 5 增加返回信息 Cas –server 默认只会返回用户名到cas-client ,若需返回更多信息到客户端则: 1 注释掉 bean :
  • 15. 同时在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(“enabled ");
  • 16. 五 cas-client(基于spring security工程)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包 3 设置相应的切入点与filter …………. 声明cas服务器端登录的地址,此处写IP或主机名均可 不使用http的自动配置。 *entry-point-ref="casEntryPoint"作用是认证的入口,是一个实现 AuthenticationEntryPoint接口的类。为ExceptionTranslationFilter类提供认证依据。 使用自定义的Filter,放置在过滤器链的CAS_FILTER的位置
  • 17. serviceProperties 为认证成功后服务端返回的地址. 该地址将作为参数传递到服务端 此处不能写为IP 的形式。需写为主机名(证书生成时写的计算机全名)或域名 sendRenew 为boolean类型 当为true时每新打开窗口则需重新登录 casFilter 配置如下:    为cas的过滤器当server返回Ticket后 client 需再次将ticket发送到server进行校验,此处可配置成功的Handler与失败的Handler
  • 18.                                  
  • 19.       
  • 20. Cas单点 注销Filter 为 requestSingleLogoutFilter, singleLogoutFilter          
  • 21. 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进行注销 在web.xml中添加Listener org.jasig.cas.client.session.SingleSignOutHttpSessionListener