`

cas 笔记一 原理1

阅读更多

 

一。 CAS 简单介绍

CAS 官方网站:https://www.apereo.org/    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 应用时(访问URL :http://192.168.7.90:8081/web1 ),部署在客户web 应用的cas AuthenticationFilter ,会截获此请求,生成service 参数,然后redirect 到CAS 服务的login 接口,url 为https://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 应用,url为http://192.168.7.90:8081/web1/?ticket=ST-5-Sx6eyvj7cPPCfn0pMZuMwnbMvxpCBcNAIi6-20 。这时客户端的AuthenticationFilter 看到ticket 参数后,会跳过,由其后面的TicketValidationFilter 处理,TicketValidationFilter会利用httpclient 工具访问cas 服务的/serviceValidate 接口, 将ticket 、service 都传到此接口,由此接口验证ticket的有效性,TicketValidationFilter 如果得到验证成功的消息,就会把用户信息写入web 应用的session 里。至此为止,SSO 会话就建立起来了,以后用户在同一浏览器里访问此web 应用时,AuthenticationFilter 会在session 里读取到用户信息,所以就不会去CAS 认证,如果在此浏览器里访问别的web 应用时,AuthenticationFilter在session 里读取不到用户信息,会去CAS 的login 接口认证,但这时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 用的接口,其中/validate 是CAS1.0 定义的,/serviceValidate 是CAS2.0 定义的,其中/serviceValidate 返回xml 格式的数据,/proxy 、/proxyValidate 是支持代理认证功能的接口,/CentralAuthenticationService 接口用于和远程的web services 交互。对于一般web 应用的单点登录来讲,/login 、/logout 、/serviceValidate 这3 个接口已经可以满足要求 。CAS 协议中已经对这些接口做了定义,链接为:http://www.jasig.org/cas/protocol 。下面是我对CAS 各个接口实现的的详细说明。

 

/login:

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


 

                                                              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 Cookie ,cookie 的值就是AuthenticationViaFormAction 的 submit 方法生成的 TicketGrantingTicket 对象的 ID 。

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

 

 

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

   处理逻辑:   

        1) removeCookie

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

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

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

                redirect 到 sevice 参数标识的url

             }

          else{

             redirect 到内置的casLogoutView (cas/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 参数对应,则验证通过,验证通过后,请求转发至casServiceSuccessView (cas/WEB-INF/view/jsp/default/protocol/2.0/casServiceValidationSuccess.jsp ),验证不通过,则转发到failureView 。

 

四 认证相关的概念及流程

概念

  • Credentials 用户提供的用于登录用的凭据信息,如用户名/ 密码、证书、IP 地址、Cookie 值等。比如 UsernamePasswordCredentials ,封装的是用户名和密码。CAS 进行认证的第一步,就是把从UI 或request 对象里取到的用户凭据封装成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 完成认证逻辑

     原文出处:

          http://blog.csdn.net/dongdong_java/article/details/22293377

 

 

没有单点登录情况下的话,登录认证和授权认证默认在AuthorizingRealm的doGetAuthorizationInfo和doGetAuthenticationInfo中进行,所以我这里是通过shiroDbRealm(继承AuthorizingRealm的自定义类)覆写doGetAuthorizationInfo和doGetAuthenticationInfo,实现自定义登录认证和授权认证。

 

有单点登录情况下,登录认证是在casserver进行的,那么执行流程是这样的:用户从 cas server登录成功后,跳到cas client的CasRealm执行默认的doGetAuthorizationInfo和doGetAuthenticationInfo,此时doGetAuthenticationInfo做的工作是把登录用户信息传递给shiro,保持默认即可,而对于授权的处理,可以通过MyCasRealm(继承CasRealm的自定义类)覆写doGetAuthorizationInfo进行自定义授权认证。

分享到:
评论

相关推荐

    CAS 开发综合笔记

    1. **CAS的基本原理**: CAS的核心理念是用户只需在单一入口点进行身份验证,之后访问其他已集成CAS的服务时无需再次登录。这通过TGT(Ticket Granting Ticket)和ST(Service Ticket)来实现。用户首次登录时会...

    CAS整合LDAP实现单点登录原理及部署

    CAS整合LDAP实现单点登录的原理及部署学习笔记,cas实现单点登录,ldap负责账户管理

    DDR2笔记本内存条的原理图

    1. 工作原理: DDR2内存采用的是同步动态随机存取技术,即它与系统总线同步工作,以固定频率进行数据传输。其双倍数据速率是指在时钟周期的上升沿和下降沿都能传输数据,相比DDR一代,数据传输速率翻倍。DDR2内存条...

    CAS单点登录学习笔记五之CAS服务器数据源

    1. CAS服务器架构和原理 2. 数据源配置及其在SSO中的作用 3. JDBC连接数据库的基本概念 4. CAS服务器的数据库连接配置参数 5. 自定义密码编码器的设计与实现 6. 密码安全存储的最佳实践 理解这些内容对于开发和维护...

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

    1. `edu.yale.its.tp.cas.util`包:包含了一个工具类`SecureURL.java`,用于处理HTTPS URL访问。 2. `edu.yale.its.tp.cas.proxy`包:提供了处理代理认证的类,特别是`ProxyTicketReceptor.java`,这是一个接收PGT...

    微机原理与接口技术笔记

    《微机原理与接口技术》笔记详述 微机原理是计算机科学中的基础课程,它主要探讨微型计算机的内部结构、工作原理以及与其交互的接口技术。本笔记将围绕几个核心概念进行阐述,包括SRAM芯片的应用、多片级联、8259A...

    尚硅谷JUC视频笔记整理,很详细和全面,帮你迅速掌握JUC

    本笔记整理涉及了JUC的内存可见性、volatile关键字以及CAS算法和原子变量等多个方面,以下是对这些知识点的详细说明。 ### 内存可见性 在多线程环境下,内存可见性是指当一个线程修改了某个共享变量的值,其他线程...

    cas配置详解

    这个压缩包文件包含了一系列的学习笔记,可以帮助我们深入了解CAS的工作原理和配置。 首先,让我们从基础概念开始。CAS的核心功能是为用户提供统一的登录验证,用户只需在一个系统中登录,即可访问所有支持CAS的...

    并发编程atomic&collections-课上笔记1

    并发编程 atomic & collections - 课上笔记1 本文主要讲述了 Java 中的并发编程,包括 atomic 包的介绍、CAS 算法的原理、ABA 问题的解决方案,以及 collections 中的 HashMap、HashTable 和 ConcurrentHashMap 的...

    笔记本内存介绍简要介绍

    读取操作中,先进行阵列寻址,然后发出读取命令,经过tRCD(RAS-CAS延迟)后,数据开始输出,经过tCL(CAS延迟)第一笔数据会被读出。突发长度决定了同一行中连续传输的数据单元数量。预充电是为了关闭当前行,准备...

    dotnet-cas-client-1.1.0源码

    CAS(Central Authentication Service)是一个开源的身份验证框架,主要用于实现单点登录(Single Sign-On, SSO),使得用户在访问多个应用时只需要登录一次。这个项目是为了帮助.NET开发者集成他们的应用程序到一个...

    笔记本电脑内存的结构特点和工作原理.pdf

    1. 内存数据和地址的关系:内存由许多行和列的内存单元组成,每个单元存储一个数据。数据的存储位置由行和列的序号(地址)确定。在存取数据时,需要通过行地址锁存电路和列地址锁存电路来选择特定的内存单元。RAS...

    CLR笔记(一)

    这篇笔记可能涵盖了CLR的基础概念、工作原理以及在实际编程中的应用。 【描述】虽然描述部分为空,但根据标题我们可以推测这是一篇关于.NET开发者的个人学习笔记,可能详细记录了作者对CLR的理解和学习过程,也可能...

    Thread基础知识点笔记总结

    CAS 的工作原理是首先检查要操作的变量是否是期望的值,如果是,则进行操作,否则不进行操作。CAS 的优点是高效,但缺点是循环时间长,给 CPU 带来很大开销;只能保证一个共享变量的原子性;ABA 问题。 3. ...

    笔记本信号解释

    在笔记本电脑的维修及理解其工作原理时,深入掌握各类信号的定义与功能是至关重要的。笔记本内部信号繁多,覆盖了从CPU到I/O设备的所有通信路径,每一种信号都有其特定的功能与作用。下面,我们将对笔记本中的关键...

    BAT完整面试笔记.docx

    - **工作原理**:发送方维持一个发送窗口,接收方也维持一个接收窗口,发送方根据接收方的反馈调整窗口大小。 #### 六、互斥锁的实现原理(屏蔽中断,CAS) **互斥锁实现原理**: - **屏蔽中断**:通过禁用系统的...

    Java并发编程笔记之ConcurrentHashMap原理探究.docx

    而从Java 8开始,ConcurrentHashMap改用CAS(Compare and Swap)无锁算法,进一步减少了锁的使用,提高了并发性能。在Java 8中,内部结构也发生了变化,将Segment的概念替换为更细粒度的Node链表,使用了更高效的...

    Java并发编程学习笔记

    1. **线程安全与锁 Synchronized 底层实现原理**: 线程安全是指在多线程环境下,对共享数据的操作始终保持一致性。Synchronized是Java中的关键字,用于实现线程同步,它基于Java虚拟机的Monitor机制,通过对象头的...

Global site tag (gtag.js) - Google Analytics