Spring Security не обслуживает статический контент

Я пытаюсь получить весеннюю безопасность, чтобы разрешить обслуживание статических файлов, таких как .css .js и т. д., без необходимости предварительного входа в систему.

Я пытался создать конфигурацию MVC с обработчиком ресурсов и изменить правила в конфигурации безопасности spring, но, похоже, ничего не работает.

MvcConfig.java:

@Configuration
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer {

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

}

SecurityConfig.java:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers("/", "/assets/**")
            .permitAll()
            .anyRequest()
            .authenticated()
            .and()
            .formLogin()
            .loginPage("/login")
            .permitAll()
            .and()
            .logout()
            .permitAll();
}

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

}

Когда я перехожу к http://localhost:8080/assets/js/particles.min.js, я ожидаю, что он вернет содержимое файла, но каждый раз, когда я пробую ссылки, такие как localhost:8080/assets/*, он возвращает содержимое login.html.

Мои файлы активовМои файлы проекта

Я использую 2.1.5 и добавил @Configuration в код, но проблема не устранена.

Skyterix 05.06.2019 15:34
связь Этот проект был недавно создан сегодня утром. Я пытался решить эту проблему в течение довольно долгого времени, и у меня есть только два дополнительных файла. Я добавил ссылку на их содержимое, но я не думаю, что они будут полезны. Это мой первый проект, в котором я использую Spring Security, поэтому возможно, что где-то я допустил простую ошибку, которую не вижу. Я также обновил сообщение со скриншотом моих файлов.
Skyterix 05.06.2019 16:11

Он находится в конфигурации подпакета.

Skyterix 05.06.2019 16:16

О, извините, я только что понял, что произошло. Я обновил страницу в то же время, когда она остановилась в точке останова, и я предположил, что это было по запросу. Просто проверьте это еще раз, и вы правы, это один раз в начале.

Skyterix 05.06.2019 17:24

Ничего не меняется

Skyterix 05.06.2019 19:00
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
5
1 471
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

web.ignoring().antMatchers("/assets/**");

Приведенный выше оператор сообщит безопасности Spring игнорировать любой запрос, начинающийся с "/ресурсы/". Итак, если бы я был вами, я бы удалил всю следующую конфигурацию:

.antMatchers("/", "/assets/**")
        .permitAll()

методом configure(HttpSecurity http).

Я обнаружил, что добавление web.ignoring().antMatchers("/assets/") исправлено для кого-то, но даже его удаление не решает проблему. Проблема все еще сохраняется

Skyterix 05.06.2019 15:33

Я думаю, что вы меня неправильно поняли. Посмотрите на эту ссылку spring.io/blog/2013/07/03/…, чтобы лучше понять

El-MAHMOUDI 05.06.2019 17:52

Попробуйте изменить на:

http.authorizeRequests()
        .antMatchers("/").permitAll()
        .antMatchers("/assets/").permitAll()
        .and()
        .authorizeRequests()
        .anyRequest()
        .authenticated()
        .and()
        .formLogin()
        .loginPage("/login")
        .permitAll()
        .and()
        .logout()
        .permitAll();

Тем не менее, вместо файла отображается содержимое login.html

Skyterix 05.06.2019 16:59
Ответ принят как подходящий

Предположим, что ваши статические файлы находятся под src/main/resources:

Есть две основные части для настройки:

Реализуйте интерфейс WebMvcConfigurer для обнаружить ваших статических ресурсов:

@Configuration
public class MvcConfig implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        if (!registry.hasMappingForPattern("/assets/**")) {
            registry.addResourceHandler("/assets/**")
                    .addResourceLocations("/assets/");
        }
    }
}

Настройте конфигурацию безопасности, чтобы статические ресурсы (такие как CSS, JavaScript и изображения) были общедоступными:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

  // Your settings

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

        // Your AuthN handlers and filter chain...

        http        
            .authorizeRequests()
                .antMatchers("/").permitAll()
                .antMatchers("/css/**").permitAll()
                .antMatchers("/img/**").permitAll()
                .antMatchers("/js/**").permitAll()
                .anyRequest().authenticated();

        // Logout handler...
    }
}

Предположим, что у вас есть файл CSS следующего вида:

src/main/resources/assets/css/layout.css

Веб-сервер сделает его доступным по адресу:

http://<root_url>:<port>/css/layout.css

Эффект тот же, он показывает содержимое login.html.

Skyterix 05.06.2019 18:57

Таким образом, проблема где-то в другом, так как конфигурация статического ресурса довольно проста. Вы проверили, что ваш контроллер MVC отображает правильную страницу содержимого? Существуют ли какие-либо перенаправления, управляемые пользовательскими обработчиками?

vdenotaris 05.06.2019 19:12

Существует только один контроллер с одним сопоставлением для обработки / входа в систему, я не могу придумать какое-либо другое место, где может быть проблема, кроме конфигурации безопасности.

Skyterix 05.06.2019 20:49

В основном вас перенаправляет цепочка фильтров authN. Учтите, что если вы поместите свои статические файлы в src/main/resources/assets, нет необходимости включать "ресурсы" в ваш URL-адрес. Например, src/main/resources/assets/css/layout.css будет доступен в http://<root_url>/css/layout.css через веб-сервер.

vdenotaris 05.06.2019 20:58

Проблема, с которой я столкнулся при использовании этого подхода, заключается в том, что я не могу разделить доступ к статическому и доступ к контроллерам в моей настройке ведения журнала. мои файлы журналов переполнены кучей запросов на получение статических файлов.

Ravi Yenugu 06.07.2020 20:03

Другие вопросы по теме