Spring Boot Security在https之后阻止静态资源

时间:2019-04-25 15:01:04

标签: java spring spring-boot https

我在论坛上进行了一些搜索,但是找不到合适的内容。我最近在服务器(VPS)上发布了我的spring boot multi maven项目。一切都很好,但是当我使用Let's Encrypt通过HTTPS保护该站点后,该站点的静态内容将不被提供,而是被阻止(403)。 这是我的应用程序的结构:

app
--api
  --src/main/resources/static
--business
--model
--repository

静态资源位于api maven模块的src / main / resources / static文件夹中。

我可以使用https://example-app.com/index.html

访问我的网站主页。

js和其他资源在index.html的同一级别上。

在spring boot安全性的安全性配置中,我具有:

protected void configure(HttpSecurity http) throws Exception {
    http.csrf().disable().exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and()
            .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and().authorizeRequests()
            .antMatchers("/api/public/**").permitAll()
            .antMatchers("/api/**").authenticated()
            .anyRequest().permitAll();
    http.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
}

正如我所说,在https之前,我完全能够运行我的应用程序,但是现在当我访问index.html时,我在浏览器控制台中有很多403(js,图像,css,字体)。如您所见,我的安全配置非常宽松,所以我认为这不是问题所在。 我认为这是Spring Boot配置错误的选项。

更新

经过一些测试,我发现从应用程序内部调用的其余api总是以403结尾,但是如果我尝试在应用程序上下文外部(从url,邮递员...)调用它们,则它们都可以正常工作。

1 个答案:

答案 0 :(得分:0)

这有点猜测,但让我们看看。 httpSecurity.antMatcher(/api/public/**).permitAll()仅适用于已通过身份验证的用户。由于您使用SessionCreationPolicy.STATELESS,因此在您的应用内调用资源时,AuthenticationContext可能不可用。

如果您不介意将资源公开给未经身份验证的用户,则可以尝试执行以下操作:

public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers(/api/public/**);
    }
}