SpringBoot在使用Security和JWT时,应当怎么放行图片等静态资源#访问静态资源#静态资源放行#报错401
这周在调试代码的过程中遇到了一个问题
我们用浏览器访问后端接口时采用域名+URI的方式
http://localhost:9090/back/user/find?page=1
当我们需要从后台获取图片或者其他静态资源的时候,我们应当怎么做
不妨先直接这样访问
http://localhost:9090/static/upload/A.jpg
当我们输入一下格式URL的时候,后端会误认为当前访问的是一个不存在的接口
可能会需要token验证,或者404(一般都是路径不对)报错找不到资源
为此我们需要解决两个问题:
1 怎么让框架知道,我访问的是资源文件,而不是接口
2 访问资源文件的时候,和访问接口一样,都会被过滤器或者拦截器拦截,使用了jwt安全验证,需要带上token请求头,但是我们访问的时,不想验证,因此需要放行。
对症下药
一、创建配置类
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;///**没有生效的静态资源放行/
@Configuration
public class ResourceConfig implements WebMvcConfigurer {@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");}
}
看到了这里有两个需要配置的路径:
注意
这一步完成了,标志着这个文件夹下的所有文件是静态资源,可以作为网络资源进行访问。
但是还有一个问题:
我们的jwt此时依然生效,需要验证登录的token,为了方便,我们直接将这些资源免密放行。
二、匹配器放行
这是我的WebSecurityConfigure配置类。
@EnableGlobalMethodSecurity(prePostEnabled = true) //至关重要的注解,缺失会导致验证不起效
@EnableWebSecurity
public class WebSecurityConfigure extends WebSecurityConfigurerAdapter {@Autowiredprivate UserDetailsService userDetailsService;//过滤器@Autowiredprivate JwtAuthenticationTokenFilter jwtAuthenticationTokenFilter;//入口@Autowiredprivate RestAuthenticationEntryPoint restAuthenticationEntryPoint;//访问拒绝处理器@Autowiredprivate RestfulAccessDeniedHandler restfulAccessDeniedHandler;// 参数: HttpSecurity http//**http.authorizeRequests()**// 下添加了多个匹配器,每个匹配器用来控制不同的URL接受不同的用户访问。// 简单讲,http.authorizeRequests()就是在进行请求的权限配置。@Overrideprotected void configure(HttpSecurity http) throws Exception {//第二步:我们用我们自己的数据库数据来完成权限验证// 开启跨域和关闭csrf保护http.cors().and().csrf().disable().sessionManagement()//允许配置会话管理.sessionCreationPolicy(SessionCreationPolicy.STATELESS)//Spring Security不会创建HttpSession,也不会使用它获取SecurityContext.and().authorizeRequests().antMatchers("/index","/login","/upload/**","/back/product/upload",//文件上传"/front/**",//公司详情 + 页面导航"/back/**/latest" //最新产品+新闻).permitAll()// 首页 和 登录页面 放行.antMatchers(HttpMethod.OPTIONS).permitAll() //options 方法的请求放行.anyRequest().authenticated() // 其它请求要认证.and()// 这一步,告诉Security 框架,我们要用自己的UserDetailsService实现类// 来传递UserDetails对象给框架,框架会把这些信息生成Authorization对象使用.userDetailsService(userDetailsService);// 过滤前,我们使用jwt进行过滤http.addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);
// http.authorizeRequests()
// .antMatchers("/index").permitAll()//放行
// .anyRequest().authenticated()
// .and()
// .formLogin()//访问security自带的login接口
// .and()
// // 这一步,告诉Security 框架,我们要用自己的UserDetailsService实现类
// // 来传递UserDetails对象给框架,框架会把这些信息生成Authorization对象使用
// .userDetailsService(userDetailsService);//添加自定义未授权和未登录结果返回http.exceptionHandling().accessDeniedHandler(restfulAccessDeniedHandler).authenticationEntryPoint(restAuthenticationEntryPoint);}
实际应用中只需要在匹配器中添加:
便实现了静态资源放行。
当我们能通过浏览器拿到图片,意味着这个静态资源时暴露到本地网络上的,说明配置是成功的
SpringBoot在使用Security和JWT时,应当怎么放行图片等静态资源#访问静态资源#静态资源放行#报错401相关推荐
- 【报错笔记】在做图片上传时上传图片后可以跳转到上传成功界面,也没有报错,数据库中也传入了值,可是eclipse中webapp下怎样都无法生存目录。
在做图片上传时上传图片后可以跳转到上传成功界面,也没有报错,数据库中也传入了值,可是eclipse中webapp下怎样都无法生存目录. 我使用UUID生成8级目录,在webapp下创建目录,将图片传进 ...
- vue 项目在编译时,总是出现系统崩的状态,node 命令框也会报错,报错信息中有v7 或者 v8 的样式。
项目场景: 背景: vue 项目在编译时,总是出现系统崩的状态,node 命令框也会报错. 问题描述 问题: vue 项目在编译时,总是出现系统崩的状态,node 命令框也会报错,如下图:有v7 或者 ...
- python打开文件时,找不到文件 FileNotFoundError: [Errno 2] No such file or directory报错
小白一枚,记录学习错误,共同进步 python打开文件时,找不到文件 FileNotFoundError: [Errno 2] No such file or directory报错 UnicodeD ...
- 当在 终端 中用 npm 安装 Vant 组件库时,发生“npm ERR code ERESOLVE ;npm ERRERESOLVE could not resolve;”报错时,该怎么办?
出现的问题: 当在 终端 中用 npm 安装 Vant 组件库时,发生 npm ERR! code ERESOLVE: npm ERR! ERESOLVE could not resolve:报错时, ...
- SpringBoot 2 + Spring Security 5 + JWT 的单页应用 Restful 解决方案
此前我已经写过一篇类似的教程,但那时候使用了投机的方法,没有尊重 Spring Security 的官方设计,自己并不感到满意.这段时间比较空,故重新研究了一遍. 特性 使用 JWT 进行鉴权,支持 ...
- springboot的yml配置文件绑定时必须和相应的类中的属性类型对应,不然启动报错
今天启动springboot应用时一开始一直是error,访问localhost也无法打开: 此时自己的Person.java: package boot.bean; import lombok.Da ...
- sqlserver安装时尽量少的占用c盘_安装3dmax出现command line option 报错,如何解决
安装3dmax出现command line option syntax error./type command for help错误解决办法!如果点击确定,安装直接结束~安装不成功! 解决方案信息: ...
- new一个xssfworkbook时出错_java用poi操作excel的时候,new XSSFWorkbook,总是报错?
问 题 走到箭头那一步的时候,总是调到handlerMehtodInvoker.class 这里 为什么捕捉不到异常? 解决方案 看你的代码,貌似实现的是要读取Excel文件吧.代码如下:具体的跟你的 ...
- jwt 例子 java_spring boot 入门之security oauth2 jwt完美整合例子-java编程
一.本文简介 本文主要讲解Java编程中spring boot框架+spring security框架+spring security oauth2框架整合的例子,并且oauth2整合使用jwt方式存 ...
最新文章
- 某程序员为方便老婆工作,写了一些小工具给老婆用!如今老婆要离职,公司老板却要求必须把工具留下!网友:跟他收费!...
- Android开发之Activity转场动画
- java 张龙_张龙 JAVA5新特性学习笔记
- Javaweb学习笔记——(三)——————JavaScript基础DOM基础
- matlab四维图程序,Matlab 四维图形绘制
- 部署DNS split分离解析服务
- php 类自动执行,php类中的魔术方法及类的自动加载
- hypermesh10的安装
- 好看的按钮集合HTML + CSS各种好看按钮组件
- 盛夏七月,欢迎来京城看“火烧云”
- 图解排序算法之堆排序(Java)
- 输入一行字符,统计其中的英文字符、数字字符、空格和其他字符的个数。
- 【Proteus仿真】DAC0832+51单片机汇编实现三角波输出
- 2021年4月4日新增
- springboot+java农家乐系统-住宿-美食-活动vue
- PMP项目管理培训总结
- git版本回退(git reset、git revert、git stash)
- 用计算机设计购物小票,商友星云系统软件票据和条码标签设计和打印
- 计算机网络 — VLAN
- Git忽略文件(.ignore)以及git status,git diff,git rm命令