使用Spring Boot + Spring Security时图像上出现403错误

时间:2016-03-09 20:09:02

标签: java spring spring-security spring-boot

我第一次尝试使用Spring Boot而且我遇到了错误403,我无法弄清楚如何解决问题

我已经使用thymeleaf创建了一个管理页面:

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>The Link Application</title>
    <link rel="stylesheet" href="css/bootstrap.min.css"/>
</head>
<body>

<nav class="navbar navbar-default">
    <div class="container-fluid">

        <div class="navbar-header">
            <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
                <span class="sr-only">Toggle Navigation</span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>
            <a class="navbar-brand" href="#">
                <img src="img/Company-logo-sm-header.png" />
            </a>
        </div>
    </div>
</nav>

...

CSS完全加载并位于src/main/resources/static/css,给出错误403的图片位于src/main/resources/static/img

这是我的Application课程:

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application {

  public static void main(String[] args) throws Exception {
    SpringApplication.run(Application.class, args);
  }

}

我有一个MVC配置课程:

@Configuration
public class MvcConfig extends WebMvcConfigurerAdapter {

  @Override
  public void addViewControllers(ViewControllerRegistry registry) {
    registry.addViewController("/home").setViewName("home");
    registry.addViewController("/").setViewName("home");
    registry.addViewController("/hello").setViewName("hello");
    registry.addViewController("/login").setViewName("login");
  }

}

一个安全配置,我不确定我是否正确使用它,antMatchers(...).permitAll()对我来说似乎应该允许图像:

@Configuration
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

  @Override
  protected void configure(HttpSecurity http) throws Exception {

    http
        .authorizeRequests()
          .antMatchers("/public/**", "/resources/**","/resources/public/**").permitAll()
          .antMatchers("/", "/home", "/link").permitAll()
          .antMatchers("/css/**", "/js/**", "/img/**", "**/favicon.ico").anonymous()
          .antMatchers("/admin").hasRole("ADMIN")
        .anyRequest().authenticated().and()
        .formLogin().loginPage("/login").permitAll().and()
        .logout().permitAll();
  }

  @Override
  public void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth
        .inMemoryAuthentication()
        .withUser("admin").password("admin").roles("USER", "ADMIN").and()
        .withUser("user").password("user").roles("USER");
  }

}

我使用的是Spring Boot 1.3.3 我在/src/main/resources中没有公共目录,我的所有静态内容都进入/src/main/resources/static,css进入css子文件夹,js进入js子文件夹,它们都工作正常在执行<link rel="stylesheet" href="css/bootstrap.min.css"/><script src="js/jquery-2.2.1.min.js"></script>

知道为什么我/src/main/resouces/static/img中的图片给了我一个错误403而/src/main/resouces/static/css中的CSS和/src/main/resouces/static/js中的JS不是?

2 个答案:

答案 0 :(得分:2)

我认为只是你的安全配置需要工作。

您不需要这条线,因为这就是静态资产的投放地点。它不是一条可以访问的路径。

.antMatchers("/public/**", "/resources/**","/resources/public/**").permitAll()

对于此行,请尝试将.anonymous()更改为.permitAll(),然后您就可以访问这些图片了。

.antMatchers("/css/**", "/js/**", "/img/**", "**/favicon.ico").anonymous()

答案 1 :(得分:0)

我想在above Patrick answer中添加一些内容,答案对我有帮助,但是我还有另一个错误。当我添加

.antMatchers("/assets/css/**", "/assets/js/**", "/assets/img/**", "**/favicon.ico").permitAll();
将{p}的

错误代码更改为403。因为我忘记添加

404

我从another source找到了这个。 我希望其他人不会重复我的错误。