欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

话不能说得太绝对不然下不了台(单点登录Filter排除部分url)

程序员文章站 2024-03-25 17:33:22
...

其实这次的问题解决分分钟按以往习惯是不值得啰嗦一篇博客的,但这次着实有点下不了台,归根结底还是自己对单点登录的jar包不了解,所以想记录一下,以后好好看源码再说话,即:

话不能说得太绝对不然下不了台(单点登录Filter排除部分url)

事情是这样的,现在公司项目集成单点登录不奇怪,负责的一个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()方法:

话不能说得太绝对不然下不了台(单点登录Filter排除部分url)

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

话不能说得太绝对不然下不了台(单点登录Filter排除部分url)

看来重点在ignoreUrlPatternMatcherStrategyClass,这个ignoreUrlPatternMatcherStrategyClass是该Filter的一个属性默认为null:

话不能说得太绝对不然下不了台(单点登录Filter排除部分url)

看一下怎么初始化它的:

话不能说得太绝对不然下不了台(单点登录Filter排除部分url)

到这里就不需要解释了,原来只要给AuthenticationFilter初始化的时候加一个init-Param就行了,param-name就是ignorePattern,如下:

话不能说得太绝对不然下不了台(单点登录Filter排除部分url)

这样/rest开头的url这个AuthenticationFilter就不会拦截了,分分钟实现了部分url绕过单点。结果斩钉截铁地说不行的是我,开开心心地说搞定了的也是我,以后要记得,不知道的东西多了去了,话不能说太绝对。

 

相关标签: 日常问题