protected Map<String, ?> applySecurityManager(Ini ini) {
        WebIniSecurityManagerFactory factory;
        if (CollectionUtils.isEmpty(ini)) {
            factory = new WebIniSecurityManagerFactory();
        } else {
            factory = new WebIniSecurityManagerFactory(ini);
        }

        // Create the security manager and check that it implements WebSecurityManager.
        // Otherwise, it can't be used with the filter.
        SecurityManager securityManager = factory.getInstance();
        if (!(securityManager instanceof WebSecurityManager)) {
            String msg = "The configured security manager is not an instance of WebSecurityManager, so "
                    + "it can not be used with the Shiro servlet filter.";
            throw new ConfigurationException(msg);
        }

        setSecurityManager((WebSecurityManager) securityManager);

        return factory.getBeans();
    }
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