即使加载图像,Spring Boot App也会为资源中的所有静态内容返回401

时间:2019-02-18 12:32:33

标签: java spring spring-boot spring-mvc spring-security

我有一个Spring Boot Webapp,其中包含针对不同路由的一些安全性配置。该项目的一些资源如下:

  • 资源/
  • 静态/
    • css /
    • img /
    • js /
    • 库/
  • 模板/
  • 配置文件/
  • application.properties

问题是,尽管我可以通过模板引擎(thymeleaf)加载视图(不带样式),但所有对静态内容的请求都返回401代码。

现在,我搜索并找到了许多有关此问题的内容。这里有趣的是,没有加载js,libs和css文件,但显示的是图像。需要说明的是:即使图像在显示时也返回401代码。

我发现的一些已经问到的问题是:

我已经研究了很多春季文档


这是我的配置文件,安全性文件和登录文件,我已经对其进行了很多改动,但仍然无济于事:

@EnableWebMvc
@Configuration
@ImportResource({"classpath:mongo-config.xml"})
public class ProjectConfiguration implements  WebMvcConfigurer {

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

@EnableWebSecurity
@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

@Override
protected void configure(HttpSecurity http) throws Exception {
    System.out.println("Security Config");
    http    .csrf().disable()
            .httpBasic().disable()
            .authorizeRequests()
                .antMatchers("/js/**","/css/**","/img/**","/libs/**").permitAll()
                .antMatchers("/userManagement", "/userManagement/**", "/rest/auth").permitAll()
                .antMatchers("/admin", "/admin/**").hasRole("ADMIN")
                .antMatchers("/managementSettings", "/managementSettings/**").hasRole("MANAGEMENT")
                .antMatchers("/user/**").hasRole("USER")
                .antMatchers("/**").hasAnyRole("USER", "DEMO", "MANAGEMENT")
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .successHandler( CustomSimpleURLAuthenticationSuccesHandler())
                .failureUrl("/login?error")
                .and()
            .logout()
                .permitAll()
                .logoutRequestMatcher( new AntPathRequestMatcher("/logout"))
                .logoutSuccessUrl("/login")
                .and()
            .addFilterAfter(AjaxRedirectFilter(), ExceptionTranslationFilter.class)
            .headers()
                .httpPublicKeyPinning()
                .addSha256Pins("*********************","*************************")
                .includeSubDomains(true)
                .maxAgeInSeconds(10000);
}

@Override
public void configure(WebSecurity web) {
    web
            .ignoring()
            .antMatchers("/js/**","/css/**","/img/**","/libs/**");
}

<div class="content">
    <img style="margin:auto" class="img-responsive" th:src="@{/img/logo.png}"/>
</div>

我想指出几件事:

  1. @ {/ img / logo.png}似乎是从视图中请求的正确端点,因为如果我在此处进行任何更改,图像将不会显示

  2. 以同样的方式,如果我更改了安全性或配置文件中的任何路由,则图像也不显示,因此那里的路由也必须正确

  3. 如果我打开浏览器开发人员工具并检查“网络”选项卡,它说:“未能加载响应数据”,但是如果双击该文件,则实际上它会以从服务器加载的纯文本格式打开js资源。 dev tools captureplain text jQuery display


因此,话虽这么说,我如何在视图中加载所有静态文件?只要可以访问我的文件

2 个答案:

答案 0 :(得分:0)

您必须将资产URL的安全性配置为allowAll,例如本教程https://www.baeldung.com/spring-mvc-static-resources的第五部分。我想。

答案 1 :(得分:0)

经过大量研究和尝试来解决该问题,该解决方案是删除过时的API REST代码,该代码与整个项目的安全性息息相关。

项目迁移中的典型内容