001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one
003     * or more contributor license agreements.  See the NOTICE file
004     * distributed with this work for additional information
005     * regarding copyright ownership.  The ASF licenses this file
006     * to you under the Apache License, Version 2.0 (the
007     * "License"); you may not use this file except in compliance
008     * with the License.  You may obtain a copy of the License at
009     *
010     *     http://www.apache.org/licenses/LICENSE-2.0
011     *
012     * Unless required by applicable law or agreed to in writing,
013     * software distributed under the License is distributed on an
014     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015     * KIND, either express or implied.  See the License for the
016     * specific language governing permissions and limitations
017     * under the License.
018     */
019    package org.apache.shiro.web.filter.mgt;
020    
021    import org.apache.shiro.util.ClassUtils;
022    import org.apache.shiro.web.filter.authc.AnonymousFilter;
023    import org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter;
024    import org.apache.shiro.web.filter.authc.FormAuthenticationFilter;
025    import org.apache.shiro.web.filter.authc.UserFilter;
026    import org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter;
027    import org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter;
028    import org.apache.shiro.web.filter.authz.PortFilter;
029    import org.apache.shiro.web.filter.authz.RolesAuthorizationFilter;
030    import org.apache.shiro.web.filter.authz.SslFilter;
031    
032    import javax.servlet.Filter;
033    import javax.servlet.FilterConfig;
034    import javax.servlet.ServletException;
035    import java.util.LinkedHashMap;
036    import java.util.Map;
037    
038    /**
039     * Enum representing all of the default Shiro Filter instances available to web applications.  Each filter instance is
040     * typically accessible in configuration the {@link #name() name} of the enum constant.
041     *
042     * @since 1.0
043     */
044    public enum DefaultFilter {
045    
046        anon(AnonymousFilter.class),
047        authc(FormAuthenticationFilter.class),
048        authcBasic(BasicHttpAuthenticationFilter.class),
049        perms(PermissionsAuthorizationFilter.class),
050        port(PortFilter.class),
051        rest(HttpMethodPermissionFilter.class),
052        roles(RolesAuthorizationFilter.class),
053        ssl(SslFilter.class),
054        user(UserFilter.class);
055    
056        private final Class<? extends Filter> filterClass;
057    
058        private DefaultFilter(Class<? extends Filter> filterClass) {
059            this.filterClass = filterClass;
060        }
061    
062        public Filter newInstance() {
063            return (Filter) ClassUtils.newInstance(this.filterClass);
064        }
065    
066        public Class<? extends Filter> getFilterClass() {
067            return this.filterClass;
068        }
069    
070        public static Map<String, Filter> createInstanceMap(FilterConfig config) {
071            Map<String, Filter> filters = new LinkedHashMap<String, Filter>(values().length);
072            for (DefaultFilter defaultFilter : values()) {
073                Filter filter = defaultFilter.newInstance();
074                if (config != null) {
075                    try {
076                        filter.init(config);
077                    } catch (ServletException e) {
078                        String msg = "Unable to correctly init default filter instance of type " +
079                                filter.getClass().getName();
080                        throw new IllegalStateException(msg, e);
081                    }
082                }
083                filters.put(defaultFilter.name(), filter);
084            }
085            return filters;
086        }
087    }