安全/权限框架Shiro(2)之拦截器

安全/权限框架Shiro(2)之拦截器

微信搜索 zze_coding 或扫描 👉 二维码关注我的微信公众号获取更多资源推送:

在前一篇入门程序中我们其实已经使用了 Shiro 默认提供的拦截器 anonauthc,它提供的所有拦截器可以在下面这个枚举类中看到:

// 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 异常;

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://www.zze.xyz/archives/shiro2.html

Buy me a cup of coffee ☕.