spring+shiro+cas的整合問題之循環重定向
場景介紹:
1.CAS伺服器採用JASIG CAS 【3.5.3】
2.SHIRO【1.2.3】
3.SPRING【4.1.RELEASE】
伺服器配置的域名為www.test.com,登錄的路徑為www.test.com/cas/
客戶應用域名為localhost:8080,應用的項目地址為localhost:8080/demo/admin/main,(登錄地址為:localhost:8080/demo/admin/login).
要達到的效果是登錄項目地址自動重定向到cas伺服器登錄,然後登錄成功後轉到項目的地址。
循環重定向的問題
客戶應用的CAS攔截器配置的攔截地址和successUrl相同,導致CAS認證成功後跳轉到successUrl後依然被CAS攔截認證導致一直循環跳轉。
失敗的循環重定向需要檢查下Rleam的failUrl地址是否和loginurl相同。
注意:springmvc配置的默認地址為/admin/,以讓項目啟動即跳轉到CAS伺服器,
CAS攔截器攔截的地址最好是一個具體的地址,而不應該是同一種格式的,我的項目中就應該是
<property name="filterChainDefinitions">
<value>/admin/=cas</value>
</property>
shiroFilter中配置
<property name="loginUrl" value="http://www.test.com/cas/login?service=http://localhost:8080/demo/admin/" />
<property name="successUrl" value="http://localhost:8080/demo/admin/main" />
注意:loginUrl和successUrl是不相同的,[相同會循環跳轉].
為了能夠在登錄失敗的時候跳轉到CAS登錄,做以下配置:
<bean id="casFilter" class="org.apache.shiro.cas.CasFilter">
<property name="failureUrl" value="http://www.test.com/cas/login?service=http://localhost:8080/demo/admin/"/>
</bean>
====================================================================================================
好久沒有鼓搗shiro配置,今天又遇到一些坑,都是以前遇到過的,在此記錄,以備以後及其他小夥伴參考:
CAS Client客戶端退出後,其它的客戶端並沒有退出,請看看客戶端配置的CAS Server是否一致,我的就因為一個是localhost一個是127.0.0.1導致.
CAS Server登錄成功後,跳轉到應用時提示重定向次數過多,調試時發現和上面的情況類似.但是配置上看不出是怎麼回事.
通過回憶測試環境的步驟,進行相應的回退,發現是因為添加了sessionManager的配置導致的,
原來默認使用的是ServletContainerSessionManager沒有問題,改成自己配置的SessionManager就會重定向。
調試後發現原來是因為沒有配置SessionIdCookie的原因,導致本地項目驗證失敗重定向到CAS Server進行認證,而CAS認證成功後跳轉到本地項目,
本地項目通過TS以及獲取Session進行驗證失敗,就這樣悲劇了。解決就是加上相應的配置
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
。。。。。
<!-- sessionManager -->
<property name="sessionManager" ref="sessionManager" />
。。。。。
</bean>
<!--<!– 自定義會話管理配置 –>-->
<bean id="sessionManager" class="cn.jely.cd.util.security.shiro.session.SessionManager">
<property name="sessionDAO" ref="sessionDAO"/>
<!-- 會話超時時間,單位:毫秒 -->
<property name="globalSessionTimeout" value="${session.sessionTimeout}"/>
<!-- 定時清理失效會話, 清理用戶直接關閉瀏覽器造成的孤立會話 -->
<property name="sessionValidationInterval" value="${session.sessionTimeoutClean}"/>
<<property name="sessionValidationSchedulerEnabled" value="true"/>
<property name="sessionIdCookie" ref="sessionIdCookie"/>
<</bean>
<!-- 指定本系統SESSIONID, 默認為: JSESSIONID 問題: 與SERVLET容器名衝突, 如JETTY, TOMCAT 等默認JSESSIONID,-->
<!–<當跳出SHIRO SERVLET時如ERROR-PAGE容器會為JSESSIONID重新分配值導致登錄會話丟失!-->
<bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie"> <constructor-arg name="name" value="JELY_SESSION_ID"/> </bean>
※錯誤 could not launch process: EOF 解決
※為什麼我們做分散式的使用都是用Redis?
TAG:程序員小新人學習 |