今天2017年9月10日,是教师节,在此感谢老师,祝老师节日快乐。我在我的学生生涯中遇到了好几个对我特别好的老师,真的很感谢他们,因为有你们,所以我们成长。
需求缘起:
有网友说:无法访问到JS/CSS/IMG,其实这个问题,对于使用过Shiro的特别好解决,只需要做简单的配置就可以搞定了,但是对于Shiro不了解的,那么可能就需要求助了。哈哈,同一个问题回答多了,耳朵也会长茧的。好了,本篇博客就是为了解决这个问题。
(1)JS/CSS/IMG被shiro拦截
我们请求spring boot的静态资源被shiro过滤器拦截了,那么我想我直接让shiro放行就可以了,也就是css:anno,img:anno,js: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等资源文件也会被拦截。也就是说:我们自定义的CustomFormAuthenticationFilter和shiroFilter不再是上下级的关系了,而是平级的关系,由Spring的ApplicationFilterConfig一起管理了。
那也就是说:我们只需要修改为上下级的关系就可以了。
首先,我们就不能CustomFormAuthenticationFilter让Spring管理了,先去掉注解@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的方式注入,那么怎么解决呢?
我们会思考是否有一种方式注册我们自定义的Filter到Spring容器中,但是又不添加Filter到FilterChain中呢?所以我们的问题也就是:怎么取消 Filter自动注册?
Spring Boot对Filter,Servlet提供了相应的注册类,来进行精细化的配置,我们可以使用注册类来取消Filter的自动注册。通过使用FilterRegistrationBean来进行Filter的注册,同时,设置enabled为false,就可以取消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
相关推荐
本项目示例基于spring boot 最新版本(2.1.9)实现,Spring Boot、Spring Cloud 学习示例,将持续更新…… 在基于Spring Boot、Spring Cloud 分布微服务开发过程中,根据实际项目环境,需要选择、集成符合项目...
NULL 博文链接:https://412887952-qq-com.iteye.com/blog/2299784
NULL 博文链接:https://412887952-qq-com.iteye.com/blog/2299777
NULL 博文链接:https://412887952-qq-com.iteye.com/blog/2299732
Spring Boot+Apache Shiro+Spring MVC+MyBatis+Quartz+Druid DEMO
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教程,PDF电子书!2合一下载
【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、...基于LayUI+Spring Boot+MySQL+JPA+Shiro的科研信息管理系统源码+项目说明+数据库.zip
转载的shiro_spring boot
Spring boot shiro
前后端分离之后台架构,供各位参考...Spring boot shiro权限管理 Ehcache缓存框架,可以改成redis Mybatis+PageHelper+通用mapper JWT前后端token验证 Swagger2 api生成工具 已经实现了用户、权限、组织等代码的实现
spring-boot2.0全新教程实例20例.zip - [spring-boot-helloWorld](https://github.com/ityouknow/spring-boot-examples/tree/master/spring-boot-helloWorld):Spring Boot 的 hello World 版本 - [spring-boot-...
手把手教你集成spring cloud + shiro微服务框架;用最少的工作量,改造基于shiro安全框架的微服务项目,实现spring cloud + shiro 框架集成。博客地址:...
com.jagregory.shiro.freemarker.ShiroTags 已经打包过的权限标签,可直接使用
spring boot+shiro 权限认证管理案例 shiro搭配缓存处理
Spring Boot学习之Shiro源码【学习狂神说,自己手动书写,可以实现正常所需的功能】 Spring Boot学习之Shiro源码【学习狂神说,自己手动书写,可以实现正常所需的功能】 Spring Boot学习之Shiro源码【学习狂神说,...
SpringMVC整合Shiro,Shiro是一个强大易用的Java安全框架,提供了认证、授权、加密和会话管理等功能。 配置applicationContext-shiro.xml 1. 配置authorizingRealm <bean id="authorizingRealm" class="com.mjm.core...
Spring Boot 2.0.4 & Shiro1.4.0 权限管理系统。 文章地址:https://xttblog.blog.csdn.net/article/details/88353878 FEBS是一个简单高效的后台权限管理系统。项目基础框架采用全新的Java Web开发框架 —— Spring ...
用springboot shiro 做的一个小demo ,方便快速入门shiro 会比security容易上手很多;
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="securityManager" ref="securityManager" /> <property name="loginUrl" value="/login.html" /> ...