ImageVerifierCode 换一换
格式:DOC , 页数:10 ,大小:115.50KB ,
资源ID:8819973      下载积分:10 金币
快捷注册下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/8819973.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请

   平台协调中心        【在线客服】        免费申请共赢上传

权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

注意事项

本文(CAS实现 SSO的原理和方法简介.doc)为本站上传会员【s4****5z】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

CAS实现 SSO的原理和方法简介.doc

1、CAS实现 SSO的原理和方法简介 1. 了解一下cas 实现single sign out的原理,如图所示:                                         图一 演示了单点登陆的工作原理。 当一个web浏览器登录到应用服务器时,应用服务器(application)会检测用户的session,如果没有session,则应用服务器会把url跳转到CAS server上,要求用户登录,用户登录成功后,CAS server会记请求的application的url和该用户的sessionId(在应用服务器跳转url时,通过参数传给CAS s

2、erver)。此时在CAS服务器会种下TGC Cookie值到webbrowser.拥有该TGC Cookie的webbrowser可以无需登录进入所有建立sso服务的应用服务器application。                                     图二 演示了单点登出的工作原理。 当一个web浏览器要求登退应用服务器,应用服务器(application)会把url跳转到CAS server上的 /cas/logout url资源上, CAS server接受请求后,会检测用户的TCG Cookie,把对应的session清除,同时会找到所有通过该T

3、GC sso登录的应用服务器URL提交请求,所有的回调请求中,包含一个参数logoutRequest,内容格式如下: @NOT_USED@ [SESSION IDENTIFIER] 所有收到请求的应用服务器application会解

4、析这个参数,取得sessionId,根据这个Id取得session后,把session删除。 这样就实现单点登出的功能。 2. 结合源代码来讲述一下内部的代码怎么实现的 首先,要实现SSO在 应用服务器application端的web.xml要加入以下配置    CAS Single Sign Out Filter    org.jasig.cas.client.session.SingleSignOutFilter

5、    CAS Single Sign Out Filter    /*     org.jasig.cas.client.session.SingleSignOutHttpSessionListener 注:如果有配置CAS client Filter,则CAS Single Sign Out

6、Filter 必须要放到CAS client Filter之前。 配置部分的目的是在CAS server回调所有的application进行单点登出操作的时候,需要这个filter来实现session清楚。 主要代码如下: org.jasig.cas.client.session.SingleSignOutFilter public void doFilter(final ServletRequest servletRequest, final ServletResponse servletResponse, final FilterChain  filterChain) throws

7、 IOException, ServletException {          final HttpServletRequest request = (HttpServletRequest) servletRequest;              if ("POST".equals(request.getMethod())) {               final String logoutRequest = request.getParameter("logoutRequest");                 if (CommonUtils.isNotBlank(

8、logoutRequest)) {                   if (log.isTraceEnabled()) {                     log.trace ("Logout request=[" + logoutRequest + "]");                  }                  //从xml中解析 SessionIndex key值                  final String sessionIdentifier = XmlUtils.getTextForElement(logoutRequest, 

9、"SessionIndex");                    if (CommonUtils.isNotBlank(sessionIdentifier)) {                          //根据sessionId取得session对象                      final HttpSession session = SESSION_MAPPING_STORAGE.removeSessionByMappingId(sessionIdentifier);                        if (session != nul

10、l) {                          String sessionID = session.getId();                            if (log.isDebugEnabled()) {                              log.debug ("Invalidating session [" + sessionID + "] for ST [" + sessionIdentifier + "]");                          }                          

11、                          try {                   //让session失效                              session.invalidate();                          } catch (final IllegalStateException e) {                              log.debug(e,e);                         }                     }                  

12、  return;                  }             }          } else {//get方式 表示登录,把session对象放到 SESSION_MAPPING_STORAGE(map对象中)              final String artifact = request.getParameter(this.artifactParameterName);              final HttpSession session = request.getSession();             

13、              if (log.isDebugEnabled() && session != null) {                 log.debug("Storing session identifier for " + session.getId());              }              if (CommonUtils.isNotBlank(artifact)) {                  SESSION_MAPPING_STORAGE.addSessionById(artifact, session);          

14、    }          }          filterChain.doFilter(servletRequest, servletResponse);      } SingleSignOutHttpSessionListener实现了javax.servlet.http.HttpSessionListener接口,用于监听session销毁事件 public final class SingleSignOutHttpSessionListener implements HttpSessionListener {       private Log log = L

15、ogFactory.getLog(getClass());          private SessionMappingStorage SESSION_MAPPING_STORAGE;              public void sessionCreated(final HttpSessionEvent event) {           // nothing to do at the moment       }        //session销毁时      public void sessionDestroyed(final HttpSessionEvent

16、 event) {          if (SESSION_MAPPING_STORAGE == null) {//如果为空,创建一个sessionMappingStorage 对象              SESSION_MAPPING_STORAGE = getSessionMappingStorage();          }          final HttpSession session = event.getSession();//取得当然要销毁的session对象                    if (log.isDebugEnabled()) {

17、              log.debug("Removing HttpSession: " + session.getId());          }          //从SESSION_MAPPING_STORAGE map根据sessionId移去session对象          SESSION_MAPPING_STORAGE.removeBySessionById(session.getId());      }      protected static SessionMappingStorage getSessionMappingStorage() {  

18、        return SingleSignOutFilter.getSessionMappingStorage();      }  } 3 CAS server端回调是怎么实现的 先来看一下配置,我们知道CAS server所有的用户登录,登出操作,都是由CentralAuthenticationServiceImpl对象来管理。 我们就先把到CentralAuthenticationServiceImpl的spring配置,在applicationContext.xml文件中     <

19、bean id="centralAuthenticationService" class="org.jasig.cas.CentralAuthenticationServiceImpl"         p:ticketGrantingTicketExpirationPolicy-ref="grantingTicketExpirationPolicy"         p:serviceTicketExpirationPolicy-ref="serviceTicketExpirationPolicy"         p:authenticationManager-ref="authen

20、ticationManager"         p:ticketGrantingTicketUniqueTicketIdGenerator-ref="ticketGrantingTicketUniqueIdGenerator"         p:ticketRegistry-ref="ticketRegistry"             p:servicesManager-ref="servicesManager"             p:persistentIdGenerator-ref="persistentIdGenerator"         p:uniqueTi

21、cketIdGeneratorsForService-ref="uniqueIdGeneratorsMap" /> 配置使用了spring2.0的xsd。CentralAuthenticationServiceImpl有一个属性叫uniqueTicketIdGeneratorsForService,它是一个map对象 它的key值是所有实现org.jasig.cas.authentication.principal.Service接口的类名,用于保存Principal对象和进行单点登出回调 4 TGC ticket的产生 application server时使用 value值为

22、org.jasig.cas.util.DefaultUniqueTicketIdGenerator对象,用于生成唯一的TGC ticket。 该属性引用的uniqueIdGeneratorsMap bean在uniqueIdGenerators.xml配置文件中。         

23、f="serviceTicketUniqueIdGenerator" />                  

24、alue-ref="samlServiceTicketUniqueIdGenerator" />               那CentralAuthenticationServiceImpl是怎么调用的呢? 我们跟踪一下代码,在创建ticket的方法 public Stri

25、ng createTicketGrantingTicket(final Credentials credentials)中 可以找到以下这样一段代码:          //创建 TicketGrantingTicketImpl 实例             final TicketGrantingTicket ticketGrantingTicket = new TicketGrantingTicketImpl(                  this.ticketGrantingTicketUniqueTicketIdGenerator                    

26、  .getNewTicketId(TicketGrantingTicket.PREFIX),                  authentication, this.ticketGrantingTicketExpirationPolicy);          //并把该对象保存到 ticketRegistry中 7        this.ticketRegistry.addTicket(ticketGrantingTicket); 5 TGC ticket 的销毁 ticketRegistry对象保存了创建的TicketGrantingTicketImpl对象,下面我

27、们看一下当ticket销毁的时候,会做什么 代码如下:       public void destroyTicketGrantingTicket(final String ticketGrantingTicketId) {           Assert.notNull(ticketGrantingTicketId);              if (log.isDebugEnabled()) {               log.debug("Removing ticket [" + ticketGrantingTicketId                   + 

28、"] from registry.");           }       //从 ticketRegistry对象中,取得TicketGrantingTicket对象           final TicketGrantingTicket ticket = (TicketGrantingTicket) this.ticketRegistry              .getTicket(ticketGrantingTicketId, TicketGrantingTicket.class);            if (ticket == null) {         

29、     return;          }            if (log.isDebugEnabled()) {              log.debug("Ticket found.  Expiring and then deleting.");          }          ticket.expire();//调用expire()方法,让ticket过期失效          this.ticketRegistry.deleteTicket(ticketGrantingTicketId);//从ticketRegistry中删除的ticket 对象

30、     } 我们看到,它是从ticketRegistry对象中取得TicketGrantingTicket对象后,调用expire方法。接下来,要关心的就是expire方法做什么事情       public synchronized void expire() {           this.expired.set(true);           logOutOfServices(); }     private void logOutOfServices() {          for (final Entry entry : t

31、his.services.entrySet()) {              entry.getValue().logOutOfService(entry.getKey());          }     } 从代码可以看到,它是遍历每个 Service对象,并执行logOutOfService方法,参数是String sessionIdentifier 现在我们可以对应到它存放的Service就是在uniqueIdGeneratorsMap bean定义中的那些实现类 因为logOutOfService方法的实现,所有实现类都是由它们继承的抽象类AbstractWebAp

32、plicationService来实现,我们来看一下 AbstractWebApplicationService的logOutOfService方法,就可以最终找出,实现SSO的真正实现代码,下面是主要代码片段:    public synchronized boolean logOutOfService(final String sessionIdentifier) {           if (this.loggedOutAlready) {              return true;           }             LOG.debug("Sendi

33、ng logout request for: " + getId());           //组装 logoutRequest参数内容           final String logoutRequest = "

34、ils.getCurrentDateAndTime()             + "\">@NOT_USED@"            + sessionIdentifier + "";       this.loggedOutAlready = true;       //回调所有的application,getOriginalUrl()是取得回调的application url        if (this.httpClient != null) {            return this.httpClient.sendMessageToEndPoint(getOriginalUrl(), logoutRequest);         }                return false;    } 至此,已经通过源代码把 CAS实现 single sign out的实现原理和方法完整叙述了一遍

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服