zoukankan      html  css  js  c++  java
  • CAS-登出配置

    该图

    当一个web 浏览器登录到应用服务器时,应用服务器(application)会监测用户的session,如果没有session,则应用服务器会把url跳转到CAS server上。要求

    用户登录,用户登录成功,CAS server会记住请求的application的url和该用户的sessionId(在应用服务器跳转到Url时,通过出参数传给CAS server).此时在CAS服务器会种下TGC Cookie值到web browser ,拥有该TGC Cookie的web browser 可以无需登录进入所有建立sso服务的应用服务器application

    第二张图中,当一个web浏览器要求退出应用服务器,应用服务器application会把url跳转到CAS server上的/cas/logout url资源上。

    CAS server接受到请求后,会检测用户的TGC cookie,把对应的session清除,同时会找到所有通过该TGC sso登录的应用服务器URL提交请求,所有的回调请求中包含一个参数 logoutRequest。

    <samlp:LogoutRequest ID="[RANDOM ID]" Version="2.0" IssueInstant="[CURRENT DATE/TIME]">
    <saml:NameID>@NOT_USED@</saml:NameID>
    <samlp:SessionIndex>[SESSION IDENTIFIER]</samlp:SessionIndex>
    </samlp:LogoutRequest>
    

      所有收到请求的应用服务器application会解析这个参数,获取sessionId,根据这个ID获取session后,把session 删除。这样就实现了单点登出功能。

    首先,要实现single sign out,在应用服务器application端的web.xml要加入以下配置

    <filter>
       <filter-name>CAS Single Sign Out Filter</filter-name>
       <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
    </filter>
    <filter-mapping>
       <filter-name>CAS Single Sign Out Filter</filter-name>
       <url-pattern>/*</url-pattern>
    </filter-mapping>
    <listener>
        <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
    </listener>
    

      注意:如果有配置CAS client Filter,则CAS Signle Sign out Filter 必须放在CAS client Filter之前

    配置部分的目的是在CAS server回调所有的application 进行单点登出操作的时候,需要这个Filter来实现session 清除。
     
    singleSignOutFilter,主要是在有ticket参数的时候,将session放到sessionMappingStorage,如果参数中存在logoutRequest,则注销session。
    什么时候注销sessionMappingStorage呢,这是靠SingleSignOutHttpSessionListener来实现的,当有session被注销的时候,触发将sessionMappingStorage中对应的sessionId中的数据删除,所以在配置单点登出的时候,一定要配置这个监听器,否则客户端很容易导致内存溢出。
     
    这个是什么什么时候触发的呢?
    在登录的客户端,调用 cas/logout,这个取得cookie里面的TGT数据,找到TGT中关联的所有ST对应的地址,向每个地址发送一个HTTP请求,并传递logoutRequest参数
    public void doFilter(final ServletRequest servletRequest, final ServletResponse servletResponse, final FilterChain filterChain) throws IOException, ServletException {  
          // 转换参数  
        final HttpServletRequest request = (HttpServletRequest) servletRequest;  
        //判断参数中是否具有artifactParameterName属性指定的参数名称,默认是ticket  
          if (handler.isTokenRequest(request)) {  
            // 如果存在,在本地sessionMappingStorage中记录session。  
              handler.recordSession(request);   
          } else if (handler.isLogoutRequest(request)) {//判断是否具有logoutParameterName参数指定的参数,默认参数名称为logoutRequest  
            // 如果存在,则在sessionMappingStorage中删除记录,并注销session。  
            handler.destroySession(request);  
              // 注销session后,立刻停止执行后面的过滤器  
              return;  
          } else {  
              log.trace("Ignoring URI " + request.getRequestURI());  
          }  
          //条件都不满足,继续执行下面的过滤器  
          filterChain.doFilter(servletRequest, servletResponse);  
      }  
    

      

    如果直接CAS的logout话,会出现注销成功页面,其实大部分情况下这个页面是没有必要的,更多的需要可能是退出后显示登录页面,并且登录成功后还是会进入到之前的业务系统,那么可以修改cas-servlet.xml
    在logoutController的bean配置中添加属性"followServiceRedirects" 设置为true,然后在业务系统的注销连接中加入"service 参数",值为业务系统的绝对URL。
    如你的业务系统URL为http://a:8080/login 那么注销URL就是 http://localhost:8080/cas/logout?service=http://a:8080/login
     
  • 相关阅读:
    11 dubbo monitor
    svn ignore忽略文件
    Java Core Dump分析过程
    10 其他
    9 jenkins
    8 jenkins
    7 nhorizons项目结构
    6 发布个人项目到私服
    5 jenkins使用gitee
    4 Linux安装git
  • 原文地址:https://www.cnblogs.com/ssgao/p/8817167.html
Copyright © 2011-2022 走看看