springboot+vue整合security及jwt中遇到的坑
背景介绍
在最近的一个项目中,前端采用vue + element-ui,后端使用springboot,整合了jwt以及spring security来实现安全校验,同时引入swagger进行前后端api测试调用。
遇到的坑
- 将前端项目npm run build后生成的项目放在后端springboot项目resouces/static/目录下,启动项目后无法访问静态资源,包括hmtl、js、css等文件
- swagger无法访问,页面无法展示
相关代码
1 | // WebMvcConfig |
1 | // WebSecurityConfig |
1 | // JwtAuthenticationFilter |
注意,这里解决跨域问题还有其他的方法,有空的时候会整理一下springboot解决跨域问题的方案。
原因分析
来看下spring boot里是怎么实现对src/main/resources/static这些目录的支持
springboot主要是通过org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration来实现的1
2
3
4
5
6
7
8
9
10
11
({ Servlet.class, DispatcherServlet.class,
WebMvcConfigurerAdapter.class })
(WebMvcConfigurationSupport.class)
10) (Ordered.HIGHEST_PRECEDENCE +
({ DispatcherServletAutoConfiguration.class,
ValidationAutoConfiguration.class })
public class WebMvcAutoConfiguration {
//省略....
}
注意到 @ConditionalOnMissingBean(WebMvcConfigurationSupport.class)这个注解,当存在WebMvcConfigurationSupport这个类的时候,WebMvcAutoConfiguration这个自动配置就会被略去,不执行,导致springboot的mvc配置失效,无法访问到静态资源。
解决方法
- 在WebMvcConfig类中,将extends WebMvcConfigurationSupport改为implements WebMvcConfigurer
- 在WebSecurityConfig类中,允许访问swagger相关的资源
1
2
3
4http
.authorizeRequests()
.antMatchers("/v2/api-docs", "/configuration/**", "/swagger*/**", "/webjars/**")
.permitAll();
Read more
有关@EnableWebMvc、WebMvcConfigurationSupport、WebMvcConfigurer的相关信息,可以阅读如下资料:
(WebMvcConfigurerAdapter已被deprecated)
[1] confuse between WebMvcConfigurationSupport and WebMvcConfigurerAdapter
[2] EnableWebMvc vs WebMvcConfigurationSupport
[3] 解析@EnableWebMvc 、WebMvcConfigurationSupport和WebMvcConfigurationAdapter
[4] SpringBoot2.x中WebMvcConfigurerAdapter已过时,使用WebMvcConfigurationSupport替换时自动配置失效
[5] Spring MVC - Importing configurations with @EnableWebMvc
[6] 深入Spring Boot:显式配置 @EnableWebMvc 导致静态资源访问失败
[7] WebMvcConfigurerAdapter 在Spring5.0已被废弃
Swagger方面:
[1] Swagger and Spring Security
[2] SpringBoot+spring Security+JWT整合swagger
[3] Spring Boot + Spring Security + JWT 集成Swagger文档问题