`

146. Spring Boot Shiro无法访问JS/CSS/IMG+自定义Filter无法访问完美方案【从零开始学Spring Boot】

阅读更多

 

  

     今天2017910日,是教师节,在此感谢老师,祝老师节日快乐。我在我的学生生涯中遇到了好几个对我特别好的老师,真的很感谢他们,因为有你们,所以我们成长

需求缘起

       有网友说:无法访问到JS/CSS/IMG,其实这个问题,对于使用过Shiro的特别好解决,只需要做简单的配置就可以搞定了,但是对于Shiro不了解的,那么可能就需要求助了。哈哈,同一个问题回答多了,耳朵也会长茧的。好了,本篇博客就是为了解决这个问题。

 

1JS/CSS/IMGshiro拦截

       我们请求spring boot的静态资源被shiro过滤器拦截了,那么我想我直接让shiro放行就可以了,也就是css:annoimg:annojs:anno,转换为shiro代码就是:

 

 

ShiroFilterFactoryBean shiroFilterFactoryBean  = new ShiroFilterFactoryBean();
filterChainDefinitionMap.put("/img/**", "anon");//img       
filterChainDefinitionMap.put("/js/**", "anon");//js
filterChainDefinitionMap.put("/css/**", "anon");//css
 

 

 

 

2)自定义Filter导致无法访问

       如果添加了上面的配置,还无法使用的,那么就看看是否是如下这种情况引起的:

ShiroConfiguration中如果您有这么一段自定义Filter的代码:

 

    @Bean
    public CustomFormAuthenticationFilter formAuthenticationFilter(){
       CustomFormAuthenticationFilter customFormAuthenticationFilter = new CustomFormAuthenticationFilter();
       return customFormAuthenticationFilter;
    }
 

 

       这样注入Filter的方式也是会出现JS/CSS/IMG无法访问的,这是为什么呢?

这是因为:容器把自定义的CustomFormAuthenticationFilter也作为容器的filter接管,所有的请求又都经过一次filter,那么就会导致一个问题出现:比如:我们定义 /js/**=anon,/css/**=anon, /img/ =anno,那么所有JS/CSS/IMG等资源文件也会被拦截。也就是说:我们自定义的CustomFormAuthenticationFiltershiroFilter不再是上下级的关系了,而是平级的关系,由SpringApplicationFilterConfig一起管理了。

       那也就是说:我们只需要修改为上下级的关系就可以了。

首先,我们就不能CustomFormAuthenticationFilterSpring管理了,先去掉注解@Bean

       第二就是:使用ShiroFilterFactoryBean进行注入,就是上下级的关系了,核心代码部分:

 

     

ShiroFilterFactoryBean shiroFilterFactoryBean  = new ShiroFilterFactoryBean();
//自定义filter.
Map<String,Filter> filters  = new HashMap<String,Filter>();
CustomFormAuthenticationFilter formAuthenticationFilter =  new CustomFormAuthenticationFilter();//初始化自定义的filter.
filters.put("authc", formAuthenticationFilter);//添加到map中.
shiroFilterFactoryBean.setFilters(filters);//交给spring shiroFilter管理

 

 

 

3)问题2方案导致新问题

       我们使用了new CustomFormAuthenticationFilter()的方式就无法使用spring的特性,在CustomFormAuthenticationFilter的类中就不能使用@Autowire注入别的service进行使用了。所以这里就存在了新的问题了,由不能直接使用@Bean的方式注入,那么怎么解决呢?

       我们会思考是否有一种方式注册我们自定义的FilterSpring容器中,但是又不添加FilterFilterChain中呢?所以我们的问题也就是:怎么取消    Filter自动注册?

       Spring BootFilterServlet提供了相应的注册类,来进行精细化的配置,我们可以使用注册类来取消Filter的自动注册。通过使用FilterRegistrationBean来进行Filter的注册,同时,设置enabledfalse,就可以取消Filter的自动注册行为了。可以参考文档:Spring Boot Document

       具体怎么操作呢?

    @Bean
    public CustomFormAuthenticationFilter customFormAuthenticationFilter(){
       System.out.println("ShiroConfiguration.formAuthenticationFilter()");
       CustomFormAuthenticationFilter customFormAuthenticationFilter = new CustomFormAuthenticationFilter();
       return customFormAuthenticationFilter;
    }
 
    @Bean
    public FilterRegistrationBean registrationBean(CustomFormAuthenticationFilter customFormAuthenticationFilter){
       System.out.println("AppcustomFormAuthenticationFilter()");
       FilterRegistrationBean registration = new FilterRegistrationBean(customFormAuthenticationFilter);
        registration.setEnabled(false);//怎么取消  Filter自动注册,不会添加到FilterChain中.
        return registration;
    }

 

       这里还是使用@Bean注入CustomFormAuthenticationFilter,但是在自动注入之后使用FilterRegistrationBean对其重新进行了设置,取消自动注册功能。这里容易犯错的地方就是CustomFormAuthenticationFilter不使用@Bean注入了,如果是这样的话,就会发现是先shiro的配置先注入,CustomFormAuthenticationFilter还没注入就无法找到了。

 

à悟空学院:https://t.cn/Rg3fKJD

学院中有Spring Boot相关的课程!点击「阅读原文」进行查看!

SpringBoot视频:http://t.cn/A6ZagYTi

Spring Cloud视频:http://t.cn/A6ZagxSR

SpringBoot Shiro视频:http://t.cn/A6Zag7IV

SpringBoot交流平台:https://t.cn/R3QDhU0

SpringData和JPA视频:http://t.cn/A6Zad1OH

SpringSecurity5.0视频:http://t.cn/A6ZadMBe

Sharding-JDBC分库分表实战http://t.cn/A6ZarrqS

分布式事务解决方案「手写代码」:http://t.cn/A6ZaBnIr 

分享到:
评论
6 楼 林祥纤 2018-11-05  
javazhy 写道
你好,最近在弄这个springboot+shiro的整合,现在静态资源的匿名访问都配置了,我在static下面又建了一层statics,然后这么配置,访问加载静态资源的时候一直405,请帮忙回复下是什么问题,谢谢 filterChainDefinitionMap.put("/statics/ace/**", "anon");


这样看,看不出来,方便把源码提供下嘛??
5 楼 javazhy 2018-11-01  
你好,最近在弄这个springboot+shiro的整合,现在静态资源的匿名访问都配置了,我在static下面又建了一层statics,然后这么配置,访问加载静态资源的时候一直405,请帮忙回复下是什么问题,谢谢 filterChainDefinitionMap.put("/statics/ace/**", "anon");
4 楼 林祥纤 2018-03-13  
jack_zou 写道
你好,请问下我spring boot配置成这样,怎么js,css能匿名访问,img,fonts目录下不行?
    @Bean("shiroFilter")
    public ShiroFilterFactoryBean factory(DefaultWebSecurityManager securityManager) {
        ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();

        // 添加自己的过滤器并且取名为jwt
        Map<String, Filter> filterMap = new HashMap<>();
        filterMap.put("jwt", new JWTFilter());
//        filterMap.put("systemLogout", new SystemLogoutFilter());
        factoryBean.setFilters(filterMap);

        factoryBean.setSecurityManager(securityManager);
// 要求登录时的链接(可根据项目的URL进行替换),非必须的属性,默认会自动寻找Web工程根目录下的"/login.jsp"页面
        factoryBean.setLoginUrl("/login");
// 登录成功后要跳转的连接,逻辑也可以自定义,例如返回上次请求的页面
// factoryBean.setSuccessUrl("/user-list");
// 用户访问未对其授权的资源时,所显示的连接
        factoryBean.setUnauthorizedUrl("/login");

        /*
         * 自定义url规则
         * http://shiro.apache.org/web.html#urls-
         */
        Map<String, String> filterRuleMap = new HashMap<>();
       
        filterRuleMap.put("logout", "logout");
// <!-- 过滤链定义,从上向下顺序执行,一般将 /**放在最为下边 -->:这是一个坑呢,一不小心代码就不好使了;
// <!-- authc:所有url都必须认证通过才可以访问; anon:所有url都都可以匿名访问-->
filterRuleMap.put("/css/**", "anon");
filterRuleMap.put("/js/**", "anon");
filterRuleMap.put("/img/**", "anon");
filterRuleMap.put("/fonts/**", "anon");
filterRuleMap.put("/assets/**", "anon");
filterRuleMap.put("/custom/**", "anon");
filterRuleMap.put("/login", "anon");


        // 所有请求通过我们自己的JWT Filter
        filterRuleMap.put("/**", "jwt");
        factoryBean.setFilterChainDefinitionMap(filterRuleMap);
        return factoryBean;
    }


应该可以的,不行你配置一个:
filterRuleMap.put("/static/fonts/**", "anon");

3 楼 jack_zou 2018-03-13  
你好,请问下我spring boot配置成这样,怎么js,css能匿名访问,img,fonts目录下不行?
    @Bean("shiroFilter")
    public ShiroFilterFactoryBean factory(DefaultWebSecurityManager securityManager) {
        ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();

        // 添加自己的过滤器并且取名为jwt
        Map<String, Filter> filterMap = new HashMap<>();
        filterMap.put("jwt", new JWTFilter());
//        filterMap.put("systemLogout", new SystemLogoutFilter());
        factoryBean.setFilters(filterMap);

        factoryBean.setSecurityManager(securityManager);
// 要求登录时的链接(可根据项目的URL进行替换),非必须的属性,默认会自动寻找Web工程根目录下的"/login.jsp"页面
        factoryBean.setLoginUrl("/login");
// 登录成功后要跳转的连接,逻辑也可以自定义,例如返回上次请求的页面
// factoryBean.setSuccessUrl("/user-list");
// 用户访问未对其授权的资源时,所显示的连接
        factoryBean.setUnauthorizedUrl("/login");

        /*
         * 自定义url规则
         * http://shiro.apache.org/web.html#urls-
         */
        Map<String, String> filterRuleMap = new HashMap<>();
       
        filterRuleMap.put("logout", "logout");
// <!-- 过滤链定义,从上向下顺序执行,一般将 /**放在最为下边 -->:这是一个坑呢,一不小心代码就不好使了;
// <!-- authc:所有url都必须认证通过才可以访问; anon:所有url都都可以匿名访问-->
filterRuleMap.put("/css/**", "anon");
filterRuleMap.put("/js/**", "anon");
filterRuleMap.put("/img/**", "anon");
filterRuleMap.put("/fonts/**", "anon");
filterRuleMap.put("/assets/**", "anon");
filterRuleMap.put("/custom/**", "anon");
filterRuleMap.put("/login", "anon");


        // 所有请求通过我们自己的JWT Filter
        filterRuleMap.put("/**", "jwt");
        factoryBean.setFilterChainDefinitionMap(filterRuleMap);
        return factoryBean;
    }
2 楼 林祥纤 2017-09-12  
lixuejian 写道
    


1 楼 lixuejian 2017-09-11  
    

相关推荐

    39.1 Spring Boot Shiro权限管理【从零开始学Spring Boot】

    在本教程中,我们将深入探讨如何使用Spring Boot与Apache Shiro进行权限管理。Spring Boot以其简洁的配置和快速的应用开发而闻名,而Shiro则是一个轻量级的安全框架,适用于身份验证、授权、会话管理和安全性相关的...

    39.4 Spring Boot Shiro权限管理【从零开始学Spring Boot】

    在本教程中,我们将深入探讨如何使用Spring Boot与Apache Shiro进行权限管理。Spring Boot以其简洁的配置和快速的应用开发能力而备受青睐,而Shiro则是一个轻量级的安全框架,用于实现用户认证、授权和会话管理。...

    39.2. Spring Boot Shiro权限管理【从零开始学Spring Boot】

    在本教程中,我们将深入探讨如何使用Spring Boot和Apache Shiro进行权限管理。Spring Boot以其简洁的配置和快速的应用开发能力而闻名,而Shiro则是一个强大的安全管理框架,提供了认证、授权、会话管理和安全加密等...

    spring boot shiro demo项目

    Spring Boot Shiro Demo项目是一个基于Spring Boot框架与Apache Shiro实现的权限管理示例,旨在帮助开发者快速理解和应用Shiro进行权限控制。相比Spring Security,Shiro通常被认为更易于理解和使用,更适合小型到...

    Spring Boot整合Shiro搭建权限管理系统

    在本文中,我们将探讨如何利用Spring Boot和Apache Shiro构建一个权限管理系统。Spring Boot以其便捷的启动和配置方式,使得快速开发变得简单。而Shiro则是一个轻量级的安全框架,用于实现用户认证和授权。 首先,...

    spring-boot示例项目

    本项目示例基于spring boot 最新版本(2.1.9)实现,Spring Boot、Spring Cloud 学习示例,将持续更新…… 在基于Spring Boot、Spring Cloud 分布微服务开发过程中,根据实际项目环境,需要选择、集成符合项目...

    spring_boot_shiro

    《Spring Boot整合Shiro实战详解》 在现代Java Web开发中,Spring Boot以其简洁的配置、快速的开发体验,已经成为主流框架。而Apache Shiro作为一款强大的安全管理框架,提供了认证、授权、会话管理和安全加密等...

    39.3 Spring Boot Shiro权限管理【从零开始学Spring Boot】

    在本主题中,我们将深入探讨如何使用Spring Boot与Apache Shiro进行权限管理。Spring Boot以其简洁的配置和快速的应用开发特性,已经成为了Java领域中的热门框架。而Shiro则是一款强大的安全框架,提供了身份验证、...

    spring boot+shiro 权限认证管理案例

    Spring Boot 和 Apache Shiro 的整合是企业级应用中常见的权限认证和安全管理方案。Spring Boot 提供了简化 Java 应用程序开发的框架,而 Shiro 是一个轻量级的安全框架,专注于身份验证、授权、会话管理和加密。...

    从零开始学Spring Boot

    1.1 前言 1.2 资料官网 1.3 spring boot起步之Hello World 1.4 Spring Boot返回json数据 1.5 Spring Boot热部署 1.6 Spring Boot使用别的json解析框架 1.7 全局异常捕捉 ...1.45 Spring Boot Shiro权限管理

    Spring Boot整合Shiro搭建权限管理系统 (2).pdf

    首先,让我们从创建一个 Spring Boot 项目开始: 1. 创建 Maven 工程: 使用 Maven 作为构建工具是标准做法,因为它提供了依赖管理和构建自动化功能。新建一个 Maven 项目,并在 `pom.xml` 文件中引入 Spring Boot...

    spring boot 集成 shiro

    **Spring Boot 集成 Shiro 深度解析** Spring Boot 是一款基于 Spring 的轻量级框架,它简化了 Spring 应用的初始搭建以及开发过程。而 Apache Shiro 是一个强大且易用的 Java 安全框架,提供了认证、授权、加密和...

    从零开始学Spring Boot与Shiro教程

    在学习过程中,提供的《从零开始学Spring Boot》PDF电子书会详细介绍Spring Boot的各个组件和使用方式,包括自动配置、起步依赖、Actuator监控、外部配置、测试等方面。而《Shiro教程》则会详细阐述Shiro的各个方面...

    Spring Boot整合Shiro搭建权限管理系统教学提纲.docx

    ### Spring Boot 整合 Shiro 搭建权限管理系统知识点详解 #### 一、Spring Boot 入门 在本部分,我们首先了解如何基于 Spring Boot 构建项目的基础框架。 1. **新建 Maven 工程** - 使用 IntelliJ IDEA 或 ...

    Spring boot shiro

    **Spring Boot Shiro 知识点详解** Spring Boot 和 Apache Shiro 是两个在Java开发中广泛使用的框架。Spring Boot 提供了快速构建和配置Spring应用的便利性,而Shiro则是一个强大且易用的安全管理框架,专注于身份...

    Spring Boot整合Shiro搭建权限管理系统.pdf

    在本文中,我们将深入探讨如何使用Spring Boot与Apache Shiro框架构建一个权限管理系统。Spring Boot以其简化Spring应用程序的开发过程而闻名,而Shiro则是一个轻量级的安全框架,提供了认证、授权、会话管理和安全...

    my-spring-boot集成shiro

    在本文中,我们将深入探讨如何将`Spring Boot`与`Apache Shiro`进行集成,以构建一个安全的基础框架。`Spring Boot`以其便捷的启动和配置方式,为开发者提供了快速开发现代Java应用的能力,而`Apache Shiro`则是一个...

    spring-boot+shiro+jpa

    在IT领域,Spring Boot、JPA(Java Persistence API)和Shiro都是常见的技术框架,用于构建高效、便捷的Web应用程序。下面将详细解释这三个技术及其在"spring-boot+shiro+jpa"项目中的应用。 首先,Spring Boot是...

    Spring Boot整合Shiro搭建权限管理系统教学提纲.pdf

    【Spring Boot整合Shiro搭建权限管理系统】 在Java后端开发中,Spring Boot因其简洁的配置和强大的功能,已经成为构建Web应用的首选框架。而Apache Shiro则是一个强大且易用的Java安全框架,用于处理认证、授权、...

Global site tag (gtag.js) - Google Analytics