Обслуживание статических веб-ресурсов в Spring Boot & Spring Приложению безопасности

Я пытаюсь разработать Spring загрузочное веб-приложение и защищать его, используя конфигурацию java безопасности Spring.

После размещения моих статических веб-ресурсов в src/main/resources/public, как указано здесь, в блоге Spring, я я могу получить статические ресурсы. i.e нажатие https://localhost/test.html в браузере служит для содержимого html.

Проблема

После того, как я включил Spring Безопасность, для доступа к URL статического ресурса требуется аутентификация.

Мое релевантное Spring Конфигурация безопасности Java выглядит следующим образом: -

@Override
    protected void configure(HttpSecurity http) throws Exception {
        // @formatter:off
        http.
            authorizeRequests()
                .antMatchers("/","/public/**", "/resources/**","/resources/public/**")
                    .permitAll()
                .antMatchers("/google_oauth2_login").anonymous()
                    .anyRequest().authenticated()
                .and()
                .formLogin()
                    .loginPage("/")
                    .loginProcessingUrl("/login")
                    .defaultSuccessUrl("/home")
                    .and()
                    .csrf().disable()
                    .logout()
                        .logoutSuccessUrl("/")
                        .logoutUrl("/logout") // POST only
                .and()
                    .requiresChannel()
                    .anyRequest().requiresSecure()
                .and()
                    .addFilterAfter(oAuth2ClientContextFilter(),ExceptionTranslationFilter.class)
                    .addFilterAfter(googleOAuth2Filter(),OAuth2ClientContextFilter.class)
                .userDetailsService(userService);
        // @formatter:on
    }

Как мне настроить antMatchers, чтобы статические ресурсы размещались внутри src/main/resources/public?

Ответ 1

Есть несколько вещей, о которых нужно знать:

  • Сопряжения Ant соответствуют пути запроса, а не пути к ресурсу в файловой системе.
  • Ресурсы, размещенные в src/main/resources/public, будут обслуживаться из корня вашего приложения. Например, src/main/resources/public/hello.jpg будет обслуживаться от http://localhost:8080/hello.jpg

Вот почему ваша текущая конфигурация сопряжения не разрешает доступ к статическим ресурсам. Чтобы работать /resources/**, вам нужно разместить ресурсы в src/main/resources/public/resources и получить к ним доступ в http://localhost:8080/resources/your-resource.

Как вы используете Spring Boot, вы можете захотеть использовать свои настройки по умолчанию, а не добавлять дополнительную конфигурацию. Spring Загрузка по умолчанию разрешает доступ к /css/**, /js/**, /images/** и /**/favicon.ico. Например, у вас может быть файл с именем src/main/resources/public/images/hello.jpg и без добавления дополнительной конфигурации он будет доступен в http://localhost:8080/images/hello.jpg без необходимости входа в систему. Вы можете увидеть это в действии в образец проверки веб-метода, где доступ разрешен к файлу CSS Bootstrap без какой-либо специальной конфигурации.

Ответ 2

  @Override
      public void configure(WebSecurity web) throws Exception {
        web
          .ignoring()
             .antMatchers("/resources/**"); // #3
      }

Игнорировать любой запрос, начинающийся с "/resources/". Это похоже на настройку http @security = none при использовании конфигурации пространства имен XML.

Ответ 3

Вот окончательное решение, после 20 часов исследования.

Шаг 1. Добавьте 'MvcConfig.java' в свой проект.

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
public class MvcConfig extends WebMvcConfigurerAdapter {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry
                .addResourceHandler("/resources/**")
                .addResourceLocations("/resources/");
    }
}

Шаг 2. Добавьте configure(WebSecurity web) переопределить класс SecurityConfig

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

Шаг 3. Поместите все статические ресурсы в webapp/resources/..

Ответ 4

Если вы используете webjars. Вы должны добавить это в свой метод configure: http.authorizeRequests().antMatchers("/webjars/**").permitAll();

Убедитесь, что это первое утверждение. Например:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().antMatchers("/webjars/**").permitAll();
        http.authorizeRequests().anyRequest().authenticated();
         http.formLogin()
         .loginPage("/login")
         .failureUrl("/login?error")
         .usernameParameter("email")
         .permitAll()
         .and()
         .logout()
         .logoutUrl("/logout")
         .deleteCookies("remember-me")
         .logoutSuccessUrl("/")
         .permitAll()
         .and()
         .rememberMe();
    }

Вам также нужно будет иметь это, чтобы включить вебджеры:

@Configuration
    public class MvcConfig extends WebMvcConfigurerAdapter {
        ...
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
                registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
        }
        ...
    }