cas-client-core單點登錄排除不需要攔截的URL


  同事提了一個要求,要求對外提供的接口不需要經過單點登錄驗證,我剛開始想,這簡單,提供不需要攔截的url數組,在AuthenticationFilter里面對url進行檢查,在此數組內,就不需要攔截。

  下面是AuthenticationFilter類的doFilter方法的部分源碼:

    public final void doFilter(final ServletRequest servletRequest, final ServletResponse servletResponse, final FilterChain filterChain) throws IOException, ServletException { final HttpServletRequest request = (HttpServletRequest) servletRequest; final HttpServletResponse response = (HttpServletResponse) servletResponse;
     //在此寫驗證url
if (isRequestUrlExcluded(request)) { logger.debug("Request is ignored."); filterChain.doFilter(request, response); return; } final HttpSession session = request.getSession(false); final Assertion assertion = session != null ? (Assertion) session.getAttribute(CONST_CAS_ASSERTION) : null; if (assertion != null) { filterChain.doFilter(request, response); return; }

  以上是部分源碼,本來我想在注釋的地方,對url進行檢查,但是下面一行的 isRequestUrlExcluded(request),這不正是檢查URL排除的地方嗎?原來cas-client已經實現了此功能。下面我們一步步的梳理代碼。

  isRequestUrlExcluded的方法如下:

    private boolean isRequestUrlExcluded(final HttpServletRequest request) { if (this.ignoreUrlPatternMatcherStrategyClass == null) { return false; } final StringBuffer urlBuffer = request.getRequestURL(); if (request.getQueryString() != null) { urlBuffer.append("?").append(request.getQueryString()); } final String requestUri = urlBuffer.toString(); return this.ignoreUrlPatternMatcherStrategyClass.matches(requestUri); }

  我們可以看到這里的關鍵是ignoreUrlPatternMatcherStrategyClass,忽略Url模式驗證策略類。

 1     protected void initInternal(final FilterConfig filterConfig) throws ServletException {  2         if (!isIgnoreInitConfiguration()) {  3             super.initInternal(filterConfig);  4  setCasServerLoginUrl(getString(ConfigurationKeys.CAS_SERVER_LOGIN_URL));  5  setRenew(getBoolean(ConfigurationKeys.RENEW));  6  setGateway(getBoolean(ConfigurationKeys.GATEWAY));  7                        
 8             final String ignorePattern = getString(ConfigurationKeys.IGNORE_PATTERN);  9             final String ignoreUrlPatternType = getString(ConfigurationKeys.IGNORE_URL_PATTERN_TYPE); 10             
11             if (ignorePattern != null) { 12                 final Class<? extends UrlPatternMatcherStrategy> ignoreUrlMatcherClass = PATTERN_MATCHER_TYPES.get(ignoreUrlPatternType); 13                 if (ignoreUrlMatcherClass != null) { 14                     this.ignoreUrlPatternMatcherStrategyClass = ReflectUtils.newInstance(ignoreUrlMatcherClass.getName()); 15                 } else { 16                     try { 17                         logger.trace("Assuming {} is a qualified class name...", ignoreUrlPatternType); 18                         this.ignoreUrlPatternMatcherStrategyClass = ReflectUtils.newInstance(ignoreUrlPatternType); 19                     } catch (final IllegalArgumentException e) { 20                         logger.error("Could not instantiate class [{}]", ignoreUrlPatternType, e); 21  } 22                 }

  紅色部分是實例化,是關鍵。我們從第八行開始看起,分別是獲取ignorePattern和ignoreUrlPatternType參數,兩者的意思分別是忽略的url和忽略的模式。

    ConfigurationKey<String> IGNORE_PATTERN = new ConfigurationKey<String>("ignorePattern", null); ConfigurationKey<String> IGNORE_URL_PATTERN_TYPE = new ConfigurationKey<String>("ignoreUrlPatternType", "REGEX");

  可以看到代碼默認的識別url的方式是正則表達式。而識別方式一共有三種,我們看一下PATTERN_MATCHER_TYPES,分別是包含、正則和精確。

1     private static final Map<String, Class<? extends UrlPatternMatcherStrategy>> PATTERN_MATCHER_TYPES =
2             new HashMap<String, Class<? extends UrlPatternMatcherStrategy>>(); 3     
4     static { 5         PATTERN_MATCHER_TYPES.put("CONTAINS", ContainsPatternUrlPatternMatcherStrategy.class); 6         PATTERN_MATCHER_TYPES.put("REGEX", RegexUrlPatternMatcherStrategy.class); 7         PATTERN_MATCHER_TYPES.put("EXACT", ExactUrlPatternMatcherStrategy.class); 8     }

  因此,我們只需在web.xml中的過濾器上添加參數來配置不需要單點登錄攔截url(例子是如果url中包含/service/,則不需要經過單點登錄驗證)。

 <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>http://cas.eguid.cc/cas-server/</param-value>
      </init-param>
      <init-param>
         <param-name>serverName</param-name>
         <param-value>http://cilent.eguid.cc/</param-value>
      </init-param>
 <init-param> <description>不攔截的請求</description> <param-name>ignorePattern</param-name> <param-value>/service/</param-value> </init-param>       <init-param> <description>識別模式</description>          <param-name>ignoreUrlPatternType</param-name>          <param-value>CONTAINS</param-value>       </init-param>
   </filter>
   <filter-mapping>
      <filter-name>casAuthenticationFilter</filter-name>
      <url-pattern>/*</url-pattern> 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM