CAS源碼追蹤系列二:AuthenticationFilter對於請求的處理

來源:互聯網
上載者:User

標籤:關注   登入   code   logger   就會   檔案   iss   stringbu   his   

上一篇我們說了在web項目中了和spring整合之後,如何進行對應Filter的初始化,如果你還沒看過,請點擊 《CAS源碼追蹤系列一:Filter的初始化》。 本篇我們來看看在初始化完成以後,cas-client是如何處理請求的。

源碼地址:https://github.com/apereo/java-cas-client

如何你還不太清楚sso的原理,你可以看看這篇文章《單點登入原理與簡單實現》。
當訪問系統受保護的資源時,cas的過濾器AuthenticationFilter會對它進行攔截,發現使用者沒有登入(系統中沒有對應的session資訊),就會跳轉到統一登入頁面。否則調用FilterChain中下一個Filter。

來看AuthenticationFilter的

doFilter(final ServletRequest servletRequest, final ServletResponse servletResponse,final FilterChain filterChain)
if (isRequestUrlExcluded(request)) {
logger.debug("Request is ignored.");
filterChain.doFilter(request, response);
return;
}
判斷請求是否是不需要被攔截,是,則進行直接調用FilterChain中下一個Filter,否則向下執行
來看看isRequestUrlExcluded方法

private boolean isRequestUrlExcluded(final HttpServletRequest request) {
/
是否有忽略url匹配類,
在AuthenticationFilter的initInternal(final FilterConfig filterConfig)進行初始化
*/
if (this.ignoreUrlPatternMatcherStrategyClass == null) {
return false;
}

    final StringBuffer urlBuffer = request.getRequestURL();    if (request.getQueryString() != null) {        urlBuffer.append("?").append(request.getQueryString());//拼裝url    }    final String requestUri = urlBuffer.toString();    /*    *匹配url是不是不用被攔截,攔截規則需要使用者在設定檔配置,    *在AuthenticationFilter的initInternal(final FilterConfig *filterConfig)載入到ignoreUrlPatternMatcherStrategyClass    */    return this.ignoreUrlPatternMatcherStrategyClass.matches(requestUri);}

final HttpSession session = request.getSession(false);//擷取使用者session,注意到參數是false,表示session沒有的話不建立一個session
final Assertion assertion = session != null ? (Assertion) session.getAttribute(CONST_CAS_ASSERTION) : null;//如果有session,則從CONST_CAS_ASSERTION屬性值擷取斷言
如果session不存在或者session中CONST_CAS_ASSERTION為空白則代表使用者還未登入,則需要繼續向下執行,否則執行下一個Filter。
final String serviceUrl = constructServiceUrl(request, response);//解析請求地址
該方法最終調用

CommonUtils.constructServiceUrl(final HttpServletRequest request, final HttpServletResponse response,
final String service, final String serverNames, final String serviceParameterName,
final String artifactParameterName, final boolean encode);
@param service: 服務地址或者說是你要請求的地址,該方法更樂意你提供這個參數(可在設定檔配置)
@param serverName:服務名,如http://localhost:8080

if (CommonUtils.isNotBlank(service)) {
return encode ? response.encodeURL(service) : service;
}
代碼一開始先對server參數進行校正,如何不為空白,直接返回。這也就是為什麼為什麼期望你配置這個參數,邏輯簡單啊。 如果不為空白,則需要對請求的url進行解析。

final String serverName = findMatchingServerName(request, serverNames);
final URIBuilder originalRequestUrl = new URIBuilder(request.getRequestURL().toString(), encode);
originalRequestUrl.setParameters(request.getQueryString());

    final URIBuilder builder;    if (!serverName.startsWith("https://") && !serverName.startsWith("http://")) {        String scheme = request.isSecure() ? "https://" : "http://";        builder = new URIBuilder(scheme + serverName, encode);    } else {        builder = new URIBuilder(serverName, encode);    }    if (builder.getPort() == -1 && !requestIsOnStandardPort(request)) {        builder.setPort(request.getServerPort());    }    builder.setEncodedPath(builder.getEncodedPath() + request.getRequestURI());

根據url擷取請求參數(request.getQueryString())時,會判斷有沒有攜帶ticket參數且必須在第一個位置(location==0),如果是就直接返回之前拼裝的url,否則繼續拼裝參數 。

final List

final String ticket = retrieveTicketFromRequest(request);//擷取請求中的ticket
然後判斷如果有ticket而且設定了網關,就直接調用下一個Filter,否則繼續向下執行。

final String urlToRedirectTo = CommonUtils.constructRedirectUrl(this.casServerLoginUrl,
getProtocol().getServiceParameterName(), modifiedServiceUrl, this.renew, this.gateway);
根據已有的資料構造一個重新導向url,也就是對於請求認證失敗的時候跳轉的地址,類似於https://localhost:8443/cas/login?service=https%3A%2F%2Flocalhost%3A8443%2Ftest%3Ftest%3D12456%26sss%3D111。“?”前面部分為認證中心登入頁面,後面則為登入成功之後要跳轉的地址。

最後一步就是執行重新導向。

總結

這一片我們簡單分析了cas-client如何處理請求,對於認證成功的繼續執行下一個Filter,失敗的則跳轉到登入頁面。下一篇我們會講cas-server端是如何處理登入的。

平時的學習過程記錄一下,沒有那麼高深,希望能幫到大家,與君共同進步。我是敲代碼的小魯班,喜歡的話給個推薦,點贊,關注吧。

CAS源碼追蹤系列二:AuthenticationFilter對於請求的處理

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.