Я пытаюсь получить весеннюю безопасность, чтобы разрешить обслуживание статических файлов, таких как .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.
Он находится в конфигурации подпакета.
О, извините, я только что понял, что произошло. Я обновил страницу в то же время, когда она остановилась в точке останова, и я предположил, что это было по запросу. Просто проверьте это еще раз, и вы правы, это один раз в начале.
Ничего не меняется




web.ignoring().antMatchers("/assets/**");
Приведенный выше оператор сообщит безопасности Spring игнорировать любой запрос, начинающийся с "/ресурсы/". Итак, если бы я был вами, я бы удалил всю следующую конфигурацию:
.antMatchers("/", "/assets/**")
.permitAll()
методом configure(HttpSecurity http).
Я обнаружил, что добавление web.ignoring().antMatchers("/assets/") исправлено для кого-то, но даже его удаление не решает проблему. Проблема все еще сохраняется
Я думаю, что вы меня неправильно поняли. Посмотрите на эту ссылку spring.io/blog/2013/07/03/…, чтобы лучше понять
Попробуйте изменить на:
http.authorizeRequests()
.antMatchers("/").permitAll()
.antMatchers("/assets/").permitAll()
.and()
.authorizeRequests()
.anyRequest()
.authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.permitAll();
Тем не менее, вместо файла отображается содержимое login.html
Предположим, что ваши статические файлы находятся под 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.
Таким образом, проблема где-то в другом, так как конфигурация статического ресурса довольно проста. Вы проверили, что ваш контроллер MVC отображает правильную страницу содержимого? Существуют ли какие-либо перенаправления, управляемые пользовательскими обработчиками?
Существует только один контроллер с одним сопоставлением для обработки / входа в систему, я не могу придумать какое-либо другое место, где может быть проблема, кроме конфигурации безопасности.
В основном вас перенаправляет цепочка фильтров authN. Учтите, что если вы поместите свои статические файлы в src/main/resources/assets, нет необходимости включать "ресурсы" в ваш URL-адрес. Например, src/main/resources/assets/css/layout.css будет доступен в http://<root_url>/css/layout.css через веб-сервер.
Проблема, с которой я столкнулся при использовании этого подхода, заключается в том, что я не могу разделить доступ к статическому и доступ к контроллерам в моей настройке ведения журнала. мои файлы журналов переполнены кучей запросов на получение статических файлов.
Я использую 2.1.5 и добавил @Configuration в код, но проблема не устранена.