`

JA-SIG CAS(v3.3)的初步总结

 
阅读更多

 CAS 配置(摘自网络,仅供产考学习交流)

配置实例

应用场景: cas 服务部署在192.168.7.115 ,是一个web 应用,访问地址为:https://cas.mycompany.com:8443/cas/ web1 应用位于192.168.7.90 ,访问地址为:http://192.168.7.90:8081/web1 ,web2 应用位于192.168.7.90 ,访问地址为:http://192.168.7.90:8082/web2 web1web2 通过cas 服务实现SSO 功能。浏览器位于本地localhost

 

cas 服务器: 192.168.7.115  启动8443 端口,需配置证书

 

web1 : 192.168.7.90

   hosts 配置: 192.168.7.115  cas.mycompany.com

    web.xml 里的配置:

    <context-param>

        <param-name>casServerUrlPrefix</param-name>

        <param-value>https://cas.mycompany.com:8443/cas/</param-value>

    </context-param>

    <context-param>

        <param-name>serverName</param-name>

        <param-value>192.168.7.90:8081</param-value>

    </context-param>

    <filter>

        <filter-name>CAS Authentication Filter</filter-name>

<filter-class>

org.jasig.cas.client.authentication.AuthenticationFilter

</filter-class>

        <init-param>

           <param-name>casServerLoginUrl</param-name>

           <param-value>https://cas.mycompany.com:8443/cas/login</param-value>

        </init-param>

    </filter>

    <filter>

        <filter-name>CAS Validation Filter</filter-name>

        <filter-class>

org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter

</filter-class>

    </filter>

    <filter-mapping>

        <filter-name>CAS Authentication Filter</filter-name>

        <url-pattern>/*</url-pattern>

    </filter-mapping>

    <filter-mapping>

        <filter-name>CAS Validation Filter</filter-name>

        <url-pattern>/*</url-pattern>

    </filter-mapping>

  

    JDK 启动参数需加上( 验证CAS 服务器证书的需要)

      -Djavax.net.ssl.trustStore=/home/yz/web1/conf/cas-client-trust-cert.jks

   -Djavax.net.ssl.trustStorePassword=casclient!@#

 

web2 : 192.168.7.90

   hosts 配置: 192.168.7.115  cas.mycompany.com

   web.xml 里的配置:

    web1web.xml 的配置,只是serverName 属性的值变成了192.168.7.90:8082

 

JDK 启动参数需加上( 验证CAS 服务器证书的需要)

      -Djavax.net.ssl.trustStore=/home/yz/web2/conf/cas-client-trust-cert.jks

   -Djavax.net.ssl.trustStorePassword=casclient!@#

 

本地 hosts 配置: 192.168.7.115  cas.mycompany.com

 

注:

1 casServerLoginUrl 参数的值是cas 服务器login 接口的值。web 应用里的cas client 在认证的时候会redirect cas 服务器,redirecturl 就是casServerLoginUrl ,因为是redirect ,所以浏览器所在机器要配置cas 服务器的域名。

2 casServerUrlPrefix 参数的值是cas 服务的访问地址。cas client 验证ticket 的时候,要访问cas 服务的/serviceValidate 接口,使用的url 就是${ casServerUrlPrefix }serviceValidate ,因为客户web 应用要验证cas 的证书,所以证书cn 字段的值必须和casServerUrlPrefix 里设置的cas 服务器的域名保持一致,并且在web 应用的服务器上配置cas 服务的访问域名。

2 serverName 参数,cas client 会用来生成service 参数,并且cas 服务器在认证通过、ticket 验证通过后,会redirectweb 应用,redirecturl 就是service 参数的值。serverName 参数可以是IP ,也可以是域名,只要保证浏览器能访问到即可。

CAS 简单介绍

CAS 官方网站: http://www.jasig.org/cas

CAS 的主要文档:

http://www.ja-sig.org/wiki/display/CASUM/Home

http://www.jasig.org/cas/cas1-architecture

http://www.jasig.org/cas/cas2-architecture

http://www.jasig.org/cas/protocol/

http://www.ja-sig.org/wiki/display/CASUM/Demo

 

CAS 官方网站上的介绍图

 

主要原理:用户第一次访问一个CAS 服务的客户web 应用时(访问URLhttp://192.168.7.90:8081/web1 ),部署在客户web 应用的cas AuthenticationFilter ,会截获此请求,生成service 参数,然后redirectCAS 服务的login 接口,urlhttps://cas:8443/cas/login?service=http%3A%2F%2F192.168.7.90%3A8081%2Fweb1%2F ,认证成功后,CAS 服务器会生成认证cookie ,写入浏览器,同时将cookie 缓存到服务器本地,CAS 服务器还会根据service 参数生成ticket,ticket 会保存到服务器,也会加在url 后面,然后将请求redirect 回客户web 应用,urlhttp://192.168.7.90:8081/web1/?ticket=ST-5-Sx6eyvj7cPPCfn0pMZuMwnbMvxpCBcNAIi6-20 。这时客户端的AuthenticationFilter 看到ticket 参数后,会跳过,由其后面的TicketValidationFilter 处理,TicketValidationFilter 会利用httpclient 工具访问cas 服务的/serviceValidate 接口,ticketservice 都传到此接口,由此接口验证ticket 的有效性,TicketValidationFilter 如果得到验证成功的消息,就会把用户信息写入web 应用的session 里。至此为止,SSO 会话就建立起来了,以后用户在同一浏览器里访问此web 应用时,AuthenticationFilter 会在session 里读取到用户信息,所以就不会去CAS 认证,如果在此浏览器里访问别的web 应用时,AuthenticationFiltersession 里读取不到用户信息,会去CASlogin 接口认证,但这时CAS 会读取到浏览器传来的cookie ,所以CAS 不会要求用户去登录页面登录,只是会根据service 参数生成一个ticket ,然后再和web 应用做一个验证ticket 的交互而已。


 

CAS 客户端 Filter 的处理逻辑

1 AuthenticationFilter

  if(url 中无ticket 参数 && session 中没有TicketValidationFilter 置的assertion 对象){

     response.sendRedirect(cas 服务器的/login 接口);// 生成service 参数,添加到url 后面

  }

  else{

    不做处理

  }

 

2 TicketValidationFilter

  if(url 中有ticket 参数){

     通过httpclient 工具访问cas 服务器的/serviceValidate 接口验证ticket 的有效性,验证失败,显示错误页面,验证成功,则生成标识用户身份的assertion 对象,放入session

  }

  else{

    不做处理

  }

 

注:

1 AuthenticationFilter 在前,TicketValidationFilter 在后。

2 AuthenticationFilter

   1 url 中无ticket 参数,且session 中没有TicketValidationFilter 置的assertion 对象,这种情况说明用户还没有认证,AuthenticationFilter 会去做认证处理;

   2 url 中无ticket 参数,且session 中有TicketValidationFilter 置的assertion 对象,这种情况说明用户已经认证成功,AuthenticationFilter 不做处理;

   3 url 中有ticket 参数,这种情况说明用户已经认证成功,但还需要经TicketValidationFilter 去验证ticket,AuthenticationFilter 不做处理。

3 TicketValidationFilter :只有客户端调用cas 服务器的/login 接口, 并成功认证,redirect 回客户端时,url 里才带有ticket 参数,在这种情况下,TicketValidationFilter 才做处理。

     

 

CAS 服务端的处理逻辑

    CAS 服务端总共对外暴露了7 个接口,客户端通过访问这7 个接口与服务端交互,这7 个接口为:/login/logout/validate/serviceValidate/proxy/proxyValidate/CentralAuthenticationService/login 是认证接口,/logout 是退出接口,负责销毁认证cookie,/validate/serviceValidate 是验证ticket 用的接口,其中/validateCAS1.0 定义的,/serviceValidateCAS2.0 定义的,其中/serviceValidate 返回xml 格式的数据,/proxy/proxyValidate 是支持代理认证功能的接口,/CentralAuthenticationService 接口用于和远程的web services 交互。对于一般web 应用的单点登录来讲,/login/logout/serviceValidate3 个接口已经可以满足要求CAS 协议中已经对这些接口做了定义,链接为:http://www.jasig.org/cas/protocol 。下面是我对CAS 各个接口实现的的详细说明。

 

/login:

登录流程这部分要考虑到不同种类用户凭证的获取方案,以及客户应用传来的servicegatewayrenew 参数的不同取值组合,CAS 为了实现流程的高度可配置性,采用了Spring Web Flow 技术。通过阅读CAS 发布包里的login-webflow.xmlcas-servlet.xmlapplicationContext.xml3 个文件,我找出 了登录有关的所有组件,并画出了它的处理流程图。



 

 

                                                              CAS 默认的登录处理流程


        第一次访问Web 应用的流程走向

 

               已经登录web1 后,访问web1 的资源(web1 没有启动session ),或访问web2 的资源

 

注:

1 InitialFlowSetupAction: 是流程的入口。用 request.getContextPath() 的值来设置 cookie Path 值, Cookie path 值是在配置文件里定义的,但这个 Action 负责将 request.getContextPath() 的值设置为 Cookie path 值,这是在 cas 部署环境改变的情况下,灵活地设置 cookie path 的方式;把 cookie 的值以及 service 参数的值放入 requestContext flowscope 里。

2 GenerateServiceTicketAction Action 负责根据 service GTC cookie 值生成 ServiceTicket 对象, ServiceTicket ID 就是返回给客户应用的 ticket 参数,如果成功创建 ServiceTicket ,则转发到 WarnAction ,如果创建失败,且 gateway 参数为 true ,则直接 redirect 到客户应用, 否则则需要重新认证。

3 viewLoginForm 这是登录页面, CAS 在此收集用户凭证。 CAS 提供的默认实现是 /WEB-INF/view/jsp/simple/ui/casLoginView.jsp

4 bindAndValidate 对应 AuthenticationViaFormAction doBind 方法,该方法负责搜集登录页面上用户录入的凭证信息(用户名、密码等),然后把这些信息封装到 CAS 内部的 Credentials 对象中。用户在 casLoginView.jsp 页面上点击提交后,会触发此方法。

5:submit   对应 AuthenticationViaFormAction submit 方法 , 如果 doBind 方法成功执行完, 则触发 submit 方法,此方法负责调用 centralAuthenticationService      grantServiceTicket 方法,完成认证工作,如果认证成功,则生成 TicketGrantingTicket 对象,放在缓存里, TicketGrantingTicket ID 就是 TGC Cookie value 值。

6 warn  CAS 提供了一个功能:用户在一个 web 应用中跳到另一个 web 应用时, CAS 可以跳转到一个提示页面,该页面提示用户要离开一个应用进入另一个应用,可以让用户自己选择。用户在登录页面 viewLoginForm 上选中了 id=”warn” 的复选框,才能开启这个功能。

WarnAction 就检查用户有没有开启这个功能,如果开启了,则转发到showWarnView, 如果没开启,则直接redirect 到客户应用。

7 SendTicketGrantingTicketAction Action 负责为response 生成TGC Cookiecookie 的值就是 AuthenticationViaFormAction submit 方法生成的 TicketGrantingTicket 对象的 ID

8 viewGenerateLoginSuccess 这是 CAS 的认证成功页面。

 

 

/logout: 对应实现类 org.jasig.cas.web.LogoutController

   处理逻辑:   

        1) removeCookie

       2) 在服务端删除TicketGrantingTicket 对象(此对象封装了cookievalue 值)

       3 redirect 到退出页面,有2 种选择:

          if(LogoutController followServiceRedirects 属性为true 值,且url 里的service 参数非空){

                redirect sevice 参数标识的url

             }

          else{

             redirect 到内置的casLogoutViewcas/WEB-INF/view/jsp/default/ui/casLogoutView.jsp ),如果url 里有url 参数,则此url 参数标识的链接会显示在casLogoutView 页面上。

           }

/serviceValidate: (对应实现类 org.jasig.cas.web.ServiceValidateController

     处理逻辑:  

  如果service 参数为空或ticket 参数为空,则转发到failureView/WEB-INF/view/jsp/default/protocol/2.0/casServiceValidationFailure.jsp

    验证ticket 。以ticket 为参数,去缓存里找ServiceTicketImpl 对象,如果能找到,且没有过期,且ServiceTicketImpl 对象对应的service 属性和service 参数对应,则验证通过,验证通过后,请求转发至casServiceSuccessViewcas/WEB-INF/view/jsp/default/protocol/2.0/casServiceValidationSuccess.jsp ),验证不通过,则转发到failureView

  

认证相关的概念及流程

概念

  • Credentials 用户提供的用于登录用的凭据信息,如用户名/ 密码、证书、IP 地址、Cookie 值等。比如 U sernamePasswordCredentials ,封装的是用户名和密码。CAS 进行认证的第一步,就是把从UIrequest 对象里取到的用户凭据封装成Credentials 对象,然后交给认证管理器去认证。
  • AuthenticationHandler 认证Handler, 每种AuthenticationHandler 只能处理一种Credentials ,如 AbstractUsernamePasswordAuthenticationHandler 只负责处理 U sernamePasswordCredentials
  • Principal 封装用户标识,比如 SimplePrincipal, 只是封装了用户名。认证成功后, credentialsToPrincipalResolvers 负责由 Credentials 生成 Principal 对象。
  • CredentialsToPrincipalResolvers 负责由 Credentials 生成 Principal 对象,每种 CredentialsToPrincipalResolvers 只处理 一种Credentials ,比如 UsernamePasswordCredentialsToPrincipalResolver 负责从 U sernamePasswordCredentials 中取出用户名,然后将其赋给生成的 SimplePrincipal ID 属性。
  • AuthenticationMetaDataPopulators 负责将 Credentials 的一些属性赋值给 Authentication attributes 属性。
  • Authentication   Authentication是认证管理器的最终处理结果, Authentication 封装了 Principal ,认证时间,及其他一些属性(可能来自 Credentials )。
  • AuthenticationManager 认证管理器得到 Credentials 对象后,负责调度AuthenticationHandler 去完成认证工作,最后返回的结果是 Authentication 对象。
  • CentralAuthenticationService  CAS 的服务类,对 Web 层提供了一些方法。该类还负责调用 AuthenticationManager 完成认证逻辑

序列图


CAS 认证处理序列图

类图

 


CAS 认证类图

分享到:
评论

相关推荐

    JA-SIG(CAS)简单部署01

    ### JA-SIG (CAS) 简单部署详解 #### 实验背景与目的 本实验旨在详细介绍JA-SIG (CAS) 的简单部署流程。CAS(Central Authentication Service)是由JA-SIG(Joint Architecture for Shared Information and ...

    基于Java的单点登录系统 JA-SIG CAS.zip

    JA-SIG CAS(Central Authentication Service)是Java社区开发的一个开源SSO解决方案,它提供了一个集中式的认证服务器,可以为各种Web应用程序提供安全的身份验证服务。 CAS的核心功能包括: 1. **身份验证**:...

    基于java的单点登录系统 JA-SIG CAS.zip

    JA-SIG CAS(Central Authentication Service)是开源社区开发的一个广泛使用的SSO框架,主要针对教育和研究机构。下面将详细阐述基于Java的JA-SIG CAS系统的相关知识点。 1. **CAS协议**: CAS(Central ...

    基于Java的源码-单点登录系统 JA-SIG CAS.zip

    总结,JA-SIG CAS是一个强大且灵活的单点登录解决方案,使用Java实现,易于集成和扩展。它的核心在于简化用户的登录流程,同时提供安全的认证机制,确保数据和应用的安全。对于需要在多个应用之间实现统一身份验证的...

    基于java的开发源码-单点登录系统 JA-SIG CAS.zip

    JA-SIG CAS(Central Authentication Service)是开源社区开发的一个广泛应用的SSO解决方案,特别适合教育和研究机构。这个压缩包"基于java的开发源码-单点登录系统 JA-SIG CAS.zip"包含了实现CAS服务器和客户端的...

    Java单点登录系统 JA-SIG CAS

    JA-SIG CAS(Central Authentication Service)是Java社区开发的一个开源项目,专门用于实现这种功能。CAS的目标是简化Web应用程序的安全管理,提供一个集中式的认证服务,从而减轻各个应用系统维护独立身份验证的...

    Java单点登录系统 JA-SIG CAS.7z

    JA-SIG CAS(Central Authentication Service)是Java社区开发的一个开源SSO项目,旨在简化Web应用的身份验证过程。 CAS的核心功能包括: 1. **统一认证**:用户只需要一个用户名和密码,就能访问所有集成到CAS的...

    JA-SIG(CAS)学习笔记3.doc

    JA-SIG CAS是其最初的开发者,它允许用户通过一个统一的登录界面访问多个相互独立的应用系统,从而简化了用户的登录体验。 CAS Server是CAS的核心组件,它负责处理用户的认证请求。在我们讨论的环境中,CAS Server ...

    java源码:Java单点登录系统 JA-SIG CAS.rar

    JA-SIG CAS(Central Authentication Service)是Java社区开发的一个开源SSO项目,旨在简化Web应用的安全管理,提高用户体验。在这个名为"Java源码:Java单点登录系统 JA-SIG CAS.rar"的压缩包中,包含了实现CAS...

    基于Java的实例源码-单点登录系统 JA-SIG CAS.zip

    这个压缩包“基于Java的实例源码-单点登录系统 JA-SIG CAS.zip”包含了一个完整的CAS服务器和客户端的源代码,可以帮助开发者理解和学习如何在Java环境中构建和集成单点登录系统。 首先,CAS的核心工作流程包括以下...

    小程序 Java单点登录系统 JA-SIG CAS(源码).rar

    免责声明:资料部分来源于合法的互联网渠道收集和整理,部分自己学习积累成果,供大家学习参考与交流。收取的费用仅用于收集和整理资料耗费时间的酬劳。 本人尊重原创作者或出版方,资料版权归原作者或出版方所有,...

    Web单点登录系统JA-SIGCAS.zip

    JA-SIG CAS(Central Authentication Service)为Web应用系统提供了单点登录服务。它的特性包括:一个开放和具有很好文档支持的协议;一个Java开源服务器组件;提供多种类型的客 户端包括Java、.Net、PHP、Perl、...

    DT-RSI-Sig - MetaTrader 4脚本.zip

    《DT-RSI-Sig:MetaTrader 4平台的高级交易指标》 在金融交易领域,技术分析是投资者预测市场走势的重要工具,而MetaTrader 4(MT4)平台则是全球最受欢迎的交易平台之一,它提供了丰富的技术指标供用户进行交易...

    Java单点登录系统 JA-SIG CAS源码

    JA-SIG CAS(Central Authentication Service)是开源社区开发的一个基于Java的SSO解决方案,广泛应用于教育和其他领域。在这个压缩包中,你将找到实现CAS核心功能的源代码,这对于理解其工作原理、自定义配置或开发...

    java资源Java单点登录系统JA-SIGCAS

    java资源Java单点登录系统 JA-SIG CAS提取方式是百度网盘分享地址

    镜像 k8s.gcr.io/sig-storage/nfs-subdir-external-provisioner:v4.0.2

    k8s.gcr.io/sig-storage/nfs-subdir-external-provisioner:v4.0.2 被墙无法pull,使用nfs方式提供k8s PVC必须的镜像包。 本人小水管拉下来的,拿走不谢。 使用方法: #解压 tar -xvf k8s.gcr.io_sig-storage_nfs-...

Global site tag (gtag.js) - Google Analytics