話不能說得太絕對不然下不了臺(單點登錄Filter排除部分url)

其實這次的問題解決分分鐘按以往習慣是不值得囉嗦一篇博客的,但這次着實有點下不了臺,歸根結底還是自己對單點登錄的jar包不瞭解,所以想記錄一下,以後好好看源碼再說話,即:

事情是這樣的,現在公司項目集成單點登錄不奇怪,負責的一個Spring項目用的這個jar包。老項目了,過濾器是配置在web.xml中,<filter-mapping>配置的時候也是"/*"全部攔,如下:

<filter>
    <filter-name>CasSingleSignOutFilter</filter-name>
    <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
</filter>
<filter>
    <filter-name>CasAuthenticationFilter</filter-name>
    <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
    <init-param>
        <param-name>casServerLoginUrl</param-name>
        <param-value>https://ssouat.hikvision.com/login</param-value>
    </init-param>
    <init-param>
        <param-name>serverName</param-name>
        <param-value>http://10.1.168.2:8080/secure/Dashboard.jspa</param-value>
    </init-param>
</filter>
<filter>
    <filter-name>CasValidationFilter</filter-name>
    <filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
    <init-param>
        <param-name>casServerUrlPrefix</param-name>
        <!--Include your CAS address-->
        <param-value>https://ssouat.hikvision.com</param-value>
    </init-param>
    <init-param>
        <param-name>serverName</param-name>
        <!--include your JIRA url here-->
    <param-value>http://10.1.168.2:8080</param-value>
    </init-param>
    <init-param>
        <param-name>redirectAfterValidation</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>
<filter-mapping>
<filter-name>CasSingleSignOutFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>CasAuthenticationFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>CasValidationFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

理論上既然要集成單點登錄那"/*"把所有資源都保護起來不是挺正常的嘛,但是現在有個奇怪的需求,來龍去脈不解釋了,最終就是要把部分用於和某外部系統對接的接口繞過單點登錄直接訪問,邏輯上肯定是單點登錄Filter不攔截這部分url最好,即排除法最優。

由於對單點登錄的那個jar包不瞭解,一門心思的在想<filter-mapping>,然後我斬釘截鐵地說<filter-mapping>不能用排除,只能是匹配,要不就匹配系統中除了需要外暴的所有接口,寫一長串<url-pattern>,但這也太傻了不好弄不好弄。

不好弄也要弄啊,然後就去反編譯了上面那個單點登錄的jar包,想看看裏面的過濾器,能不能找到點其他方法,直接看AuthenticationFilter的doFilter()方法:

看到這個我就知道要打自己的臉了,肯定是有方法排除部分url的,直接看isRequestUrlExcluded()方法:

看來重點在ignoreUrlPatternMatcherStrategyClass,這個ignoreUrlPatternMatcherStrategyClass是該Filter的一個屬性默認爲null:

看一下怎麼初始化它的:

到這裏就不需要解釋了,原來只要給AuthenticationFilter初始化的時候加一個init-Param就行了,param-name就是ignorePattern,如下:

這樣/rest開頭的url這個AuthenticationFilter就不會攔截了,分分鐘實現了部分url繞過單點。結果斬釘截鐵地說不行的是我,開開心心地說搞定了的也是我,以後要記得,不知道的東西多了去了,話不能說太絕對。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章