CAS 认证原理[通俗易懂]

CAS 认证原理[通俗易懂]一CAS原理简介CAS官方网站上的介绍图:主要原理:用户第一次访问一个CAS服务的客户web应用时(访问URL:http://192.168.7.90:8081/web1),部署在客户web应用的casAuthenticationFilter,会截获此请求,生成s…

大家好,又见面了,我是你们的朋友全栈君。

一 CAS 原理简介

CAS 官方网站上的介绍图: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 认证原理[通俗易懂]

 

                                                              CAS 默认的登录处理流程

CAS 认证原理[通俗易懂]

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

 

CAS 认证原理[通俗易懂]

               已经登录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 完成认证逻辑

序列图

CAS 认证原理[通俗易懂]

CAS 认证处理序列图

类图

 

CAS 认证原理[通俗易懂]

CAS 认证类图

转载于:https://my.oschina.net/weaver/blog/500173

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/149599.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • springMVC 配置CharacterEncodingFilter之后不起效果

    springMVC 配置CharacterEncodingFilter之后不起效果最近开始自学springMVC框架,遇到中文乱码这一经典问题,记录下解决过程,以便后续忘记web.xml里过滤器配置如下:<?xmlversion=”1.0″encoding=”UTF-8″?><web-appxmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”xmlns=”http://j…

  • 鸿蒙 OS 2.0 来了!值得开发者关注的是什么?

    鸿蒙 OS 2.0 来了!值得开发者关注的是什么?鸿蒙OS首发时,余承东特意用橙色标明1.0版本「基于开源框架,关键模块自研」。而按照华为的规划,今年在HDC上刚刚发布的鸿蒙2.0迎来了史诗级升级,完全演化成一个自主独立的操作系统。

  • deb文件安装「建议收藏」

    deb文件安装「建议收藏」使用dpkg命令安装.deb文件使用-i参数。sudodpkg-i./google-chrome-stable_current_amd64.deb如果遇到缺少依赖项的任何问题,则必须运行以下apt命令对其进行修复:sudoaptinstall-f要通过dpkg命令删除软件包,我们将使用-r以下示例中的参数:sudodpkg-rGoogle-chrome-stable使用APT命令安装.deb文件使用aptinstall。sudoaptinstall./goo

  • JavaScript正则表达式(完整版)

    JavaScript正则表达式(完整版)JavaScript正则表达式1.构建正则表达式字面量创建varreg=/正则表达式/修饰符构造函数创建varreg=newRegExp(‘正则表达式’,’修饰符’)修饰符​ i:ignoreCase,匹配忽视大小写​ m:multiline,多行匹配​ g:global,全局匹配2.正则表达式调用(实例方法)1.exec​ 匹配字符串和正则表达式的方法,​ 匹配成功:​ 返回一个数组[匹配内容,index:匹配的起始位置,

    2022年10月25日
  • docker下载安装教程_docker安装软件

    docker下载安装教程_docker安装软件前言Docker提供轻量的虚拟化,你能够从Docker获得一个额外抽象层,你能够在单台机器上运行多个Docker微容器,而每个微容器里都有一个微服务或独立应用,例如你可以将Tomcat运行在一个D

  • mt4平台3线kdj指标_三线tⅹt下载

    mt4平台3线kdj指标_三线tⅹt下载在MT4上,是没有三线KDJ指标的,分享KDJ指标源码:#propertycopyright”Copyright2020″#propertylink”https://www.mql5.com”#propertyversion”1.00″#propertystrict#propertyindicator_separate_window#propertyindicator_buffers3#propertyindicator_plots3//—p

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号