在前一篇入门程序中我们其实已经使用了 Shiro 默认提供的拦截器 anon
和 authc
,它提供的所有拦截器可以在下面这个枚举类中看到:
// org.apache.shiro.web.filter.mgt.DefaultFilter
package org.apache.shiro.web.filter.mgt;
import org.apache.shiro.util.ClassUtils;
import org.apache.shiro.web.filter.authc.*;
import org.apache.shiro.web.filter.authz.*;
import org.apache.shiro.web.filter.session.NoSessionCreationFilter;
import javax.servlet.Filter;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* Enum representing all of the default Shiro Filter instances available to web applications. Each filter instance is
* typically accessible in configuration the {@link #name() name} of the enum constant.
*
* @since 1.0
*/
public enum DefaultFilter {
anon(AnonymousFilter.class),
authc(FormAuthenticationFilter.class),
authcBasic(BasicHttpAuthenticationFilter.class),
logout(LogoutFilter.class),
noSessionCreation(NoSessionCreationFilter.class),
perms(PermissionsAuthorizationFilter.class),
port(PortFilter.class),
rest(HttpMethodPermissionFilter.class),
roles(RolesAuthorizationFilter.class),
ssl(SslFilter.class),
user(UserFilter.class);
private final Class<? extends Filter> filterClass;
private DefaultFilter(Class<? extends Filter> filterClass) {
this.filterClass = filterClass;
}
public Filter newInstance() {
return (Filter) ClassUtils.newInstance(this.filterClass);
}
public Class<? extends Filter> getFilterClass() {
return this.filterClass;
}
public static Map<String, Filter> createInstanceMap(FilterConfig config) {
Map<String, Filter> filters = new LinkedHashMap<String, Filter>(values().length);
for (DefaultFilter defaultFilter : values()) {
Filter filter = defaultFilter.newInstance();
if (config != null) {
try {
filter.init(config);
} catch (ServletException e) {
String msg = "Unable to correctly init default filter instance of type " +
filter.getClass().getName();
throw new IllegalStateException(msg, e);
}
}
filters.put(defaultFilter.name(), filter);
}
return filters;
}
}
关于拦截器的功能描述具体如下:
默认拦截器名 | 拦截器类 | 说明(括号中表示默认值) |
---|---|---|
身份验证相关 | ||
authc | org.apache.shiro.web.filter.authc.FormAuthenticationFilter |
基于表单的拦截器:如 "/**=authc",如果没有登录会跳转到相应的登录页。 主要属性: usernameParam:表单提交的用户名参数名(username); passwordParam:表单提交的密码参数名(password); rememberMeParam:表单提交的记住我参数名(rememberMe); loginUrl:登录页面地址(/login.jsp); successUrl:登录成功后默认重定向地址; failureKeyAttribute:登录失败后错误信息存储 key(shiroLoginFailure) |
authcBasic | org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter |
Basic HTTP 身份验证拦截器。 主要属性: applicationName:弹出登录框显示的信息(application)。 |
logout | org.apache.shiro.web.filter.authc.LogoutFilter |
注销/注销拦截器。 主要属性: redirectUrl:退出成功后重定向地址(/)。例:"/logout=logout"。 |
user | org.apache.shiro.web.filter.authc.UserFilter | 用户拦截器,用户已身份验证/记住我登录都可。例:"/**=user"。 |
anon | org.apache.shiro.web.filter.authc.AnonymousFilter | 匿名拦截器,即不需要登录即可访问,一般用于静态资源过滤。例:"/static/**=anon"。 |
授权相关 | ||
roles | org.apache.shiro.web.filter.authz.RolesAuthorizationFilter |
角色授权拦截器,验证用户是否拥有某角色。例:"/admin=rols[admin]" 主要属性: loginUrl:登录页面地址(/login.jsp); unauthorizedUrl:验证未授权后重定向的地址; |
perms | org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter |
权限授权拦截器,验证用户是否拥有某权限,属性与 roles 拦截器相同。例:"/user/**=perms['user:create']" |
port | org.apache.shiro.web.filter.authz.PortFilter |
端口拦截器。 主要属性: port(80):可以通过的端口。 例:"/test=port[80]",如果访问的该页面是通过非 80 端口,将自动将请求端口改为 80,并重定向到该 80 端口,其它参数(路径等)都不变。 |
rest | org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter | rest风格拦截器,自动根据请求方法构建权限字符串(GET=read,POST=create,PUT=update,DELETE=delete,HEAD=read,TRACE=read,OPTIONS=read, MKCOL=create)构建权限字符串。例:"/users=rest[user]",会自动拼出 "user:read,user:create,user:update,user:delete" 权限字符串进行权限匹配。 |
ssl | org.apache.shiro.web.filter.authz.SslFilter | SSL 拦截器,只有请求协议是 https 才能通过,否则自动跳转 https 端口(443);其它和 port 拦截器一样; |
其它 | ||
noSessionCreation | org.apache.shiro.web.filter.session.NoSessionCreationFilter | 不创建会话拦截器,调用 subject.getSession(false) 不会有什么问题,但是如果 subject.getSession(true) 将抛出 DisabledSessionException 异常; |
评论区