07、Shiro实战:拦截器

本文详细解析Apache Shiro拦截器的特点、常用类型(如anon、authc、roles)及其优先级,并提供自定义拦截器与集成到ShiroFilterFactoryBean的完整Java代码示例,帮助开发者实现灵活的请求认证与授权控制。

一、简介:

在shiro中配置拦截器可以拦截客户端发送来的请求,并可以控制是对该请求进行认证还是放行。

二、shiro拦截器的特点

简写(加粗为常用)名称优先级(1为最高)说明对应Java类
anon匿名拦截器1不需要登录就能访问,一般用于静态资源,或者移动端接口org.apache.shiro.web.filter.authc.AnonymousFilter
authc登录拦截器2需要登录认证才能访问的资源org.apache.shiro.web.filter.authc.FormAuthenticationFilter
authcBasicHttp拦截器3Http身份验证拦截器,非常用类型,不太了解org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter
logout登出拦截器4用户登出拦截器,主要属性:redirectURL退出登录后重定向的地址org.apache.shiro.web.filter.authc.LogoutFilter
noSessionCreation不创建会话拦截器5调用 subject.getSession(false) 不会有什么问题,但是如果 subject.getSession(true) 将抛出 DisabledSessionException 异常org.apache.shiro.web.filter.authc.NoSessionCreationFilter
prems权限拦截器6验证用户是否拥有资源权限org.apache.shiro.web.filter.authc.PermissionsAuthorizationFilter
port端口拦截器7其主要属性: port(80) 如果用户访问该页面是非 80,将自动将请求端口改为 80 并重定向到该 80 端口org.apache.shiro.web.filter.authc.PortFilter
restrest风格拦截器8rest 风格拦截器,自动根据请求方法构建权限字符串构建权限字符串;非常用类型拦截器org.apache.shiro.web.filter.authc.HttpMethodPermissionFilter
roles角色拦截器9验证用户是否拥有资源角色org.apache.shiro.web.filter.authc.RolesAuthorizationFilter
sslSSL拦截器10只有请求协议是https才能通过,否则你会自动跳转到https端口(443)org.apache.shiro.web.filter.authc.SslFilter
user用户拦截器11用户拦截器,用户已经身份验证 / 记住我登录的都可;org.apache.shiro.web.filter.authc.UserFilter

三、使用:

1、 自定义拦截器;

public class CustomAccessControlerFilter extends AccessControlFilter {
    @Override
    protected boolean isAccessAllowed(ServletRequest servletRequest, ServletResponse servletResponse, Object o) throws Exception {
        return false;
    }

    // 对需要被shiro拦截的请求进行拦截
    @Override
    protected boolean onAccessDenied(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception {
        /* 里面可以写一些校验token的逻辑,返回true表示认证通过,返回false表示认证失败*/
       
        return true;
    }
}

2、 将自定义拦截器设置到shiro中;

  /**
     * shiro过滤器,配置拦截哪些请求
     */
    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager){
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        LinkedHashMap<String, Filter> filtersMap = new LinkedHashMap<>();
        //用来校验token
        filtersMap.put("token", new CustomAccessControlerFilter());
        shiroFilterFactoryBean.setFilters(filtersMap);
        Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
        // 配置不会被拦截的链接 顺序判断
        filterChainDefinitionMap.put("/api/user/login", "anon");
        filterChainDefinitionMap.put("/upload/image/**","anon");
        filterChainDefinitionMap.put("/index/**","anon");
        filterChainDefinitionMap.put("/login","anon");
        filterChainDefinitionMap.put("/register","anon");
        filterChainDefinitionMap.put("/images/**", "anon");
        filterChainDefinitionMap.put("/js/**", "anon");
        filterChainDefinitionMap.put("/layui/**", "anon");
        filterChainDefinitionMap.put("/css/**", "anon");
        filterChainDefinitionMap.put("/treetable-lay/**", "anon");
        filterChainDefinitionMap.put("/api/user/token", "anon");
        //放开swagger-ui地址
        filterChainDefinitionMap.put("/swagger/**", "anon");
        filterChainDefinitionMap.put("/v2/api-docs", "anon");
        filterChainDefinitionMap.put("/swagger-ui.html", "anon");
        filterChainDefinitionMap.put("/swagger-resources/**", "anon");
        filterChainDefinitionMap.put("/webjars/**", "anon");
        filterChainDefinitionMap.put("/druid/**", "anon");
        filterChainDefinitionMap.put("/favicon.ico", "anon");
        filterChainDefinitionMap.put("/captcha.jpg", "anon");
        filterChainDefinitionMap.put("/","anon");
        filterChainDefinitionMap.put("/csrf","anon");
        filterChainDefinitionMap.put("/**","token,authc");
        shiroFilterFactoryBean.setLoginUrl("/api/user/login");
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
        return shiroFilterFactoryBean;
    }

版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: