生活随笔
收集整理的這篇文章主要介紹了
cas单点登出
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
由于項(xiàng)目需求要實(shí)現(xiàn)單點(diǎn)登出需要在網(wǎng)上找了N久終于實(shí)現(xiàn)單點(diǎn)登出。
使用cas-server-core-3.3.3.jar(CAS Server 3.3.3)
使用cas-client-core-3.1.3.jar(CAS Client 3.1.3)
?
項(xiàng)目結(jié)合CAS SpringSecurity SSH
?
普通項(xiàng)目(沒(méi)有結(jié)合Spring Security)的可以在web.xml中加入如下代碼
?
[xhtml] ?view plaincopy
<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>?? ?
?
?
在我們的項(xiàng)目中由于結(jié)合了SpringSecurity 可以將filter加入到spring Security過(guò)濾鏈中,也可以直接向上面的一樣加入web.xml中
首先在web.xml中加入監(jiān)聽(tīng)器。
?
[xhtml] ?view plaincopy
<listener>?? ??????<listener-class>?? ??????????org.jasig.cas.client.session.SingleSignOutHttpSessionListener?? ??????</listener-class>?? </listener>?? ?
?
然后把filter加入到spring Security過(guò)濾鏈中
?
?
[xhtml] ?view plaincopy
<b:bean?id="casSingleSignOutFilter"?class="check.SingleSignOutFilter">?? ????<custom-filter?before="CAS_PROCESSING_FILTER"/>?? </b:bean>?? ?
?
注意上面的class="check.SingleSignOutFilter"是我自定義的filter(由于CAS3.1.3定義的SingleSignOutFilter在某種意思上沒(méi)有起到作用)詳情請(qǐng)見(jiàn)http://www.javaeye.com/topic/546785
自己定義一個(gè)類
?
[java] ?view plaincopy
package?check;?? ?? import?java.io.IOException;?? import?java.util.Enumeration;?? ?? import?javax.servlet.FilterChain;?? import?javax.servlet.FilterConfig;?? import?javax.servlet.ServletException;?? import?javax.servlet.ServletRequest;?? import?javax.servlet.ServletResponse;?? import?javax.servlet.http.HttpServletRequest;?? import?javax.servlet.http.HttpSession;?? ?? import?org.apache.commons.logging.Log;?? import?org.apache.commons.logging.LogFactory;?? import?org.jasig.cas.client.session.HashMapBackedSessionMappingStorage;?? import?org.jasig.cas.client.session.SessionMappingStorage;?? import?org.jasig.cas.client.util.AbstractConfigurationFilter;?? import?org.jasig.cas.client.util.CommonUtils;?? import?org.jasig.cas.client.util.XmlUtils;?? ?? public?final?class?SingleSignOutFilter?extends?AbstractConfigurationFilter?? {?? ??private?String?artifactParameterName;?? ??private?static?SessionMappingStorage?SESSION_MAPPING_STORAGE?=?new?HashMapBackedSessionMappingStorage();?? ??private?static?Log?log?=?LogFactory.getLog(SingleSignOutFilter.class);?? ?? ??public?SingleSignOutFilter()?? ??{?? ????this.artifactParameterName?=?"ticket";?? ??}?? ?? ??public?void?init(FilterConfig?filterConfig)?? ????throws?ServletException?? ??{?? ????setArtifactParameterName(getPropertyFromInitParams(filterConfig,?"artifactParameterName",?"ticket"));?? ????init();?? ??}?? ?? ??public?void?init()?{?? ????CommonUtils.assertNotNull(this.artifactParameterName,?"artifactParameterName?cannot?be?null.");?? ????CommonUtils.assertNotNull(SESSION_MAPPING_STORAGE,?"sessionMappingStorage?cannote?be?null.");?? ??}?? ?? ??public?void?setArtifactParameterName(String?artifactParameterName)?{?? ????this.artifactParameterName?=?artifactParameterName;?? ??}?? ?? ??public?void?doFilter(ServletRequest?servletRequest,?ServletResponse?servletResponse,?FilterChain?filterChain)?throws?IOException,?ServletException?{?? ????final?HttpServletRequest?request?=?(HttpServletRequest)?servletRequest;????? ????final?String?logoutRequest?=?CommonUtils.safeGetParameter(request,?"logoutRequest");????? ????Enumeration?ff?=?request.getParameterNames();????? ????String?a?=?request.getQueryString();????? ????if?(CommonUtils.isNotBlank(logoutRequest))?{????? ?????????final?String?sessionIdentifier?=?XmlUtils.getTextForElement(logoutRequest,?"SessionIndex");????? ?? ?????????if?(CommonUtils.isNotBlank(sessionIdentifier))?{????? ????????????final?HttpSession?session?=?SESSION_MAPPING_STORAGE.removeSessionByMappingId(sessionIdentifier);????? ?? ????????????if?(session?!=?null)?{????? ?????????????????String?sessionID?=?session.getId();???????????????????????? ?????????????????try?{????? ????????????????????session.invalidate();????? ?????????????????}?catch?(final?IllegalStateException?e)?{????? ????????????????????????? ?????????????????}????? ????????????}????? ?????????}????? ?????}????? ????????? ????else{????? ????????final?String?artifact?=?CommonUtils.safeGetParameter(request,?this.artifactParameterName);????? ????????final?HttpSession?session?=?request.getSession(false);????? ????????????? ????????if?(CommonUtils.isNotBlank(artifact)?&&?session!=null)?{????? ????????????try?{????? ????????????????SESSION_MAPPING_STORAGE.removeBySessionById(session.getId());????? ????????????}?catch?(final?Exception?e)?{????? ????????????????????? ????????????}????? ????????????SESSION_MAPPING_STORAGE.addSessionById(artifact,?session);????? ????????}????? ????}????? ?? ????filterChain.doFilter(servletRequest,?servletResponse);????? ??}?? ?? ??public?void?setSessionMappingStorage(SessionMappingStorage?storage)?{?? ????SESSION_MAPPING_STORAGE?=?storage;?? ??}?? ?? ??public?static?SessionMappingStorage?getSessionMappingStorage()?{?? ????return?SESSION_MAPPING_STORAGE;?? ??}?? ?? ??public?void?destroy()?? ??{?? ??}?? }?? ?
完成。
這樣即可實(shí)現(xiàn)單點(diǎn)登出。(所有java應(yīng)用的單點(diǎn)退出)
1)這樣實(shí)現(xiàn)的效果是在登出的時(shí)候CAS Server 分發(fā)給各個(gè)客戶端讓各個(gè)客戶端都登出,這個(gè)得讓FIlter來(lái)獲取,例子:一個(gè)index頁(yè)面有兩個(gè)鏈接一個(gè)指向java應(yīng)用,一個(gè)指向php應(yīng)用在 java應(yīng)用加filter 后能做出相應(yīng)的動(dòng)作退出動(dòng)作,而對(duì)于php自己沒(méi)加任何filter就沒(méi)有退出。所以也得寫個(gè)filter。
?
?
2)由于我們點(diǎn)擊退出的時(shí)候請(qǐng)求CAS Server 而后Server分發(fā)任務(wù)讓每個(gè)應(yīng)用退出的消息,java程序通過(guò)filter來(lái)執(zhí)行退出。PHP提供了一個(gè)phpCAS::handleLogoutRequests()來(lái)檢驗(yàn)服務(wù)器發(fā)來(lái)的信息,
具體我們可以把這個(gè)代碼放在phpbb3/include/function.php中的點(diǎn)擊事件里面代碼如下:
?
[php] ?view plaincopy
if(!$admin?&&?CAS_ENABLE){?? ???? ????phpCAS::client(CAS_VERSION_2_0,?CAS_SERVER_HOSTNAME,?CAS_SERVER_PORT,?CAS_SERVER_APP_NAME);??? ????phpCAS::setNoCasServerValidation();??? ???? ????phpCAS::handleLogoutRequests(); ????phpCAS::forceAuthentication();??? ?
原文出自:http://blog.csdn.net/lishuangzhe7047/article/details/38587151
轉(zhuǎn)載于:https://www.cnblogs.com/challengeof/p/4281898.html
總結(jié)
以上是生活随笔 為你收集整理的cas单点登出 的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔 網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔 推薦給好友。