protected void applyFilterChainResolver(Ini ini, Map<String, ?> defaults) {
        if (ini == null || ini.isEmpty()) {
            //nothing to use to create the resolver, just return
            //(the AbstractShiroFilter allows a null resolver, in which case the original FilterChain is
            // always used).
            return;
        }

        //only create a resolver if the 'filters' or 'urls' sections are defined:
        Ini.Section urls = ini.getSection(IniFilterChainResolverFactory.URLS);
        Ini.Section filters = ini.getSection(IniFilterChainResolverFactory.FILTERS);
        if ((urls != null && !urls.isEmpty()) || (filters != null && !filters.isEmpty())) {
            //either the urls section or the filters section was defined.  Go ahead and create the resolver
            //and set it:
            IniFilterChainResolverFactory filterChainResolverFactory = new IniFilterChainResolverFactory(ini, defaults);
            filterChainResolverFactory.setFilterConfig(getFilterConfig());
            FilterChainResolver resolver = filterChainResolverFactory.getInstance();
            setFilterChainResolver(resolver);
        }
    }
Sets the config path to be used to load a .ini file for configuration if a configuration is
not specified via the {@link #getConfig() config} attribute.
<p/>
This value is {@code null} by default, but it will be automatically set to the value of the
'{@code configPath}' {@code init-param} if it exists in the {@code FilterConfig} provided by the servlet
container at startup.

@param configPath the config path to be used to load a .ini file for configuration if a configuration is
                  not specified via the {@link #getConfig() config} attribute.
web/src/main/java/org/apache/shiro/web/servlet/IniShiroFilter.java