關於spring集成shiro集成CAS的單點登陸成功後重定向循環問題的解決辦法

本人新手一枚,剛畢業不久,因最近研究shiro與cas單點登陸問題,趕上了cas服務器成功登錄後返回到client出現的各類情況表示不勝其煩。web

    博主一開始參考開濤的shiro集成cas,收穫頗豐,而後本身寫一個單點登陸Demo,其中趕上了很多的問題讓博主不多苦惱,spring

首先的web.xml配置過濾器瀏覽器

樓主一開始配置了3個過濾器,是爲了得到登陸成功後client得到server登陸時的用戶參數服務器

  <!-- CAS服務器攔截器  該過濾器負責用戶的認證工做,必須啓用它 -->
  <filter>
      <filter-name>CASFilter</filter-name>
      <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
      <init-param>
          <param-name>casServerLoginUrl</param-name>
          <param-value>https://localhost:8443/cas/login</param-value>
      </init-param>
      <init-param>
          <param-name>serverName</param-name>
          <param-value>http://localhost:8080</param-value>
      </init-param>
  </filter>
  <filter-mapping>
      <filter-name>CASFilter</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>mybatis

 <!-- 在Ticket的校驗工做前獲取ticket -->
<!--   <filter>
      <filter-name>GetTicket</filter-name>
      <filter-class>com.vacomall.filter.GetTicket</filter-class>
  </filter>
  <filter-mapping>
      <filter-name>GetTicket</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping> -->

  <!-- 該過濾器負責對Ticket的校驗工做,必須啓用它 -->
<!--   <filter>
      <filter-name>CAS Validation Filter</filter-name>
      <filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
      <init-param>
          <param-name>casServerUrlPrefix</param-name>
           下面的URL是Cas服務器的認證地址
          <param-value>https://localhost:8443/cas</param-value>
      </init-param>
      <init-param>
          <param-name>serverName</param-name>
          下面的URL是具體某一個應用的訪問地址
          <param-value>http://localhost:8080</param-value>
      </init-param>
  </filter>
  <filter-mapping>
      <filter-name>CAS Validation Filter</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>  -->

  <!--  
    該過濾器使得開發者能夠經過org.jasig.cas.client.util.AssertionHolder來獲取用戶的登陸名。  
    好比AssertionHolder.getAssertion().getPrincipal().getName()。  
    -->

<!--   <filter>  
       <filter-name>CAS Assertion Thread Local Filter</filter-name>  
       <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>  
   </filter>  
   <filter-mapping>  
       <filter-name>CAS Assertion Thread Local Filter</filter-name>  
       <url-pattern>/*</url-pattern>  
   </filter-mapping>
  自動根據單點登陸的結果設置本系統的用戶信息(具體某一個應用實現)
  <filter>
      <filter-name>CasForInvokeContextFilter</filter-name>
      <filter-class>com.vacomall.filter.CasForInvokeContextFilter</filter-class>
  </filter>
  <filter-mapping>
      <filter-name>CasForInvokeContextFilter</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping> -->
app

可是通過Cas20ProxyReceivingTicketValidationFilter過濾器以後,無論代碼如何修改,cas返回成功後的地址會通過2次重定向,以至於到jsp

  <!-- cas過濾器 -->
        <bean id="casFilter" class="com.vacomall.filter.MyCasFilter">
            <!-- 配置驗證錯誤時的失敗頁面  -->
            <property name="failureUrl" value="/casFailure.jsp"/>
            <property name="successUrl" value="/index"></property>
        </bean>url

後cas過濾器沒法獲取到ticket,以下貼圖spa

把上面3個過濾器註釋掉以後,url只通過一次重定向,並帶着ticket返回server

以後的問題就是返回失敗進入失敗頁面,進入cas服務端驗證再返回無限循環

查看源代碼以後,發現ticketValidator.validate(ticket, getCasService())拋出了異常,

ticket值與瀏覽器的值一致,沒有錯誤,那問題就出在了 getCasService()這個上面,

casService通過配置文件查看,才發現<property name="casService" value="https://localhost:8080/spring_mybatis/index"></property>

返回路徑錯誤,因本身多加了s,變成https以後沒法匹配返回路徑,才形成無限循環,至此問題解決。

相關文章
相關標籤/搜索