【SpringSecurity】SpringSecurity版本5.7.4静态资源放行失败解决,SpringBoot版本2.7.5

刚学了SpringSecurity,拿来做一个SpringBoot+SSMP项目,想着用最新版本边做边学,慢慢摸索。参照这个配置的:

SpringSecurity 配置与使用(含新 API 替换过时的 WebSecurityConfigurerAdapter)

都搭好了以后,想测试能不能直接访问静态资源。 

以下是SecurityConfig.class内容:

// Springboot2.7.0以及SrpignSecurity5.7版本以上应采用如下配置方式
@Configuration
@EnableWebSecurity  // 启用SpringSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)  // 启用方法级别的权限认证
public class SecurityConfig {

    /**
     * 配置全局的某些通用事物,例如静态资源等
     * @return
     */
    @Bean
    public WebSecurityCustomizer securityCustomizer() {
        return (web) -> web.ignoring().antMatchers("/static/**");
    }

    /**
     * http接口拦截
     * @param http
     * @return
     * @throws Exception
     */
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
                .csrf().disable()
                .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .authorizeRequests()
                .antMatchers("/user/login", "/user/register", "/user/code").anonymous()
                .anyRequest().authenticated();

        http.addFilterBefore(tokenFilter, UsernamePasswordAuthenticationFilter.class);
        // 配置异常处理器
        http.exceptionHandling()
                .authenticationEntryPoint(entryPoint);  
        // SpringSecurity设置允许跨域
        http.cors();
        return http.build();
    }
}

resources目录结构:

 正常按道理是可以访问的,然而并没有...

 资源仍然被拦截了...

于是开始百度找有没有相似情况的大佬,用了各种方式,什么法子都试了,包括但不限于:

SpringBoot与SpringSecurity跨域冲突

Spring Security 两种资源放行策略

如果在HttpSecurity中放行静态资源,试了以下,倒是不会被拦截了,但404了...

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
                .csrf().disable()
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .authorizeRequests()
                .antMatchers("/user/login", "/user/register", "/user/code").anonymous()
                /* 倒是不会拦截了,但是直接找不到
                .antMatchers("/static/head/123.jpeg").permitAll()
                */
                .anyRequest().authenticated();

        http.addFilterBefore(tokenFilter, UsernamePasswordAuthenticationFilter.class);
        // 配置异常处理器
        http.exceptionHandling()
                .authenticationEntryPoint(entryPoint);   // 配置认证异常处理器
        // SpringSecurity设置允许跨域
        http.cors();
        return http.build();
    }

我还想着至少被放行了,算有点进步,浪费了大量时间去解决这个404问题。但其实这是一个错误的方向,之后仔细研究了一下,发现这边主要放行的端口,静态资源似乎并不适用...

于是回到了上一步,继续解决被拦截问题,看了一篇文章:

找不到链接了,大致就是说SpringMVC静态资源映射配置,于是自己各种捣鼓、尝试,总算访问成功了,以下是两种解决方案:


1.静态资源不放在static文件夹

我在resources下新建了一个head文件夹,里面放上图片,然后把路径配置到WebSecurityCustomizer中,然后发现可以访问到head里面的图片

    @Bean
    public WebSecurityCustomizer securityCustomizer() {
        return (web) -> web.ignoring().antMatchers("/static/**", "/head/**");
    }

访问成功!!!可喜可贺

static文件夹为什么访问不了具体啥原因也不太清楚,可能是SpringMVC(或是SpringBoot?)和SpringSecurity映射冲突了,static 被SpringMVC锁了还是怎么的,因为我的static文件夹是创建项目时自动生成的,望大佬解答。

总之不用static文件夹就行!


2.配置SpringMVC静态资源映射路径

代码如下:

@Configuration
public class WebConfig extends WebMvcConfigurationSupport {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
    }
}

大概就是重新映射静态资源路径到 classpath:/static/ 下面,通过/static/**访问,这样的话static文件夹就可以访问了!

结果:

 这样也可以访问。需要注意的是,这样配置的话,就只能访问到static文件夹下的东西,其它文件夹就访问不到了,除非继续配置。

就是这样了

小菜鸟一枚,主要网上查不到什么具体讲解与解决办法,于是决定自己记录一下,方便自己以后出现类似问题查看,也能多少帮到点其它人吧。好了,睡觉!

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring Security版本中的配置方式有什么变化? 回答: 根据引用\[2\]中的代码内容,可以看出在Springboot2.7.0以及Spring Security5.7版本以上,配置方式发生了变化。在SecurityConfig类中,使用了@EnableWebSecurity注解来启用Spring Security,同时使用@EnableGlobalMethodSecurity(prePostEnabled = true)注解来启用方法级别的权限认证。此外,还可以通过@Bean注解来配置全局的某些通用事物,例如静态资源等。在http接口拦截方面,使用了HttpSecurity对象来配置拦截规则,包括禁用CSRF保护、设置会话管理策略、配置请求授权规则等。同时,还可以添加过滤器和异常处理器。总之,Spring Security的配置方式在不同版本中可能会有一些差异,需要根据具体版本进行相应的配置。 #### 引用[.reference_title] - *1* [springBootspring security 版本对应关系](https://blog.csdn.net/xhf852963/article/details/121494936)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [【SpringSecuritySpringSecurity版本5.7.4静态资源放行失败解决SpringBoot版本2.7.5](https://blog.csdn.net/nifengdeshuye/article/details/127955586)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值