public String getSpecificAuthChainName(HttpServletRequest request) {
    for (String specificAuthChainName : specificAuthChains.keySet()) {
      SpecificAuthChainDescriptor desc = specificAuthChains.get(specificAuthChainName);

      List<Pattern> urlPatterns = desc.getUrlPatterns();
      if (!urlPatterns.isEmpty()) {
        // test on URI
        String requestUrl = request.getRequestURI();
        for (Pattern pattern : urlPatterns) {
          Matcher m = pattern.matcher(requestUrl);
          if (m.matches()) {
            return specificAuthChainName;
          }
        }
      }

      Map<String, Pattern> headerPattern = desc.getHeaderPatterns();

      for (String headerName : headerPattern.keySet()) {
        String headerValue = request.getHeader(headerName);
        if (headerValue != null) {
          Matcher m = headerPattern.get(headerName).matcher(headerValue);
          if (m.matches()) {
            return specificAuthChainName;
          }
        }
      }
    }
    return null;
  }
  public List<String> getAuthChain(HttpServletRequest request) {

    if (specificAuthChains == null || specificAuthChains.isEmpty()) {
      return authChain;
    }

    String specificAuthChainName = getSpecificAuthChainName(request);
    SpecificAuthChainDescriptor desc = specificAuthChains.get(specificAuthChainName);

    if (desc != null) {
      return desc.computeResultingChain(authChain);
    } else {
      return authChain;
    }
  }