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 */
019package org.apache.shiro.web.filter.mgt;
020
021import org.apache.shiro.lang.util.ClassUtils;
022import org.apache.shiro.web.filter.InvalidRequestFilter;
023import org.apache.shiro.web.filter.authc.AnonymousFilter;
024import org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter;
025import org.apache.shiro.web.filter.authc.BearerHttpAuthenticationFilter;
026import org.apache.shiro.web.filter.authc.FormAuthenticationFilter;
027import org.apache.shiro.web.filter.authc.LogoutFilter;
028import org.apache.shiro.web.filter.authc.UserFilter;
029import org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter;
030import org.apache.shiro.web.filter.authz.IpFilter;
031import org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter;
032import org.apache.shiro.web.filter.authz.PortFilter;
033import org.apache.shiro.web.filter.authz.RolesAuthorizationFilter;
034import org.apache.shiro.web.filter.authz.SslFilter;
035import org.apache.shiro.web.filter.session.NoSessionCreationFilter;
036
037import javax.servlet.Filter;
038import javax.servlet.FilterConfig;
039import javax.servlet.ServletException;
040import java.util.LinkedHashMap;
041import java.util.Map;
042
043/**
044 * Enum representing all of the default Shiro Filter instances available to web applications.  Each filter instance is
045 * typically accessible in configuration the {@link #name() name} of the enum constant.
046 *
047 * @since 1.0
048 */
049public enum DefaultFilter {
050
051    /**
052     * anno filter
053     */
054    anon(AnonymousFilter.class),
055
056    /**
057     * authc filter.
058     */
059    authc(FormAuthenticationFilter.class),
060
061    /**
062     * authc basic filter.
063     */
064    authcBasic(BasicHttpAuthenticationFilter.class),
065
066    /**
067     * authc bearer filter.
068     */
069    authcBearer(BearerHttpAuthenticationFilter.class),
070
071    /**
072     * ip filter.
073     */
074    ip(IpFilter.class),
075
076    /**
077     * logout filter.
078     */
079    logout(LogoutFilter.class),
080
081    /**
082     * no session creation filter.
083     */
084    noSessionCreation(NoSessionCreationFilter.class),
085
086    /**
087     * perms filter.
088     */
089    perms(PermissionsAuthorizationFilter.class),
090
091    /**
092     * port filter.
093     */
094    port(PortFilter.class),
095
096    /**
097     * rest filter.
098     */
099    rest(HttpMethodPermissionFilter.class),
100
101    /**
102     * roles filter.
103     */
104    roles(RolesAuthorizationFilter.class),
105
106    /**
107     * ssl filter.
108     */
109    ssl(SslFilter.class),
110
111    /**
112     * user filter.
113     */
114    user(UserFilter.class),
115
116    /**
117     * invalid request filter.
118     */
119    invalidRequest(InvalidRequestFilter.class);
120
121    private final Class<? extends Filter> filterClass;
122
123    DefaultFilter(Class<? extends Filter> filterClass) {
124        this.filterClass = filterClass;
125    }
126
127    public Filter newInstance() {
128        return (Filter) ClassUtils.newInstance(this.filterClass);
129    }
130
131    public Class<? extends Filter> getFilterClass() {
132        return this.filterClass;
133    }
134
135    public static Map<String, Filter> createInstanceMap(FilterConfig config) {
136        Map<String, Filter> filters = new LinkedHashMap<String, Filter>(values().length);
137        for (DefaultFilter defaultFilter : values()) {
138            Filter filter = defaultFilter.newInstance();
139            if (config != null) {
140                try {
141                    filter.init(config);
142                } catch (ServletException e) {
143                    String msg = "Unable to correctly init default filter instance of type "
144                            + filter.getClass().getName();
145                    throw new IllegalStateException(msg, e);
146                }
147            }
148            filters.put(defaultFilter.name(), filter);
149        }
150        return filters;
151    }
152}