Проблема при загрузке ресурсов stati c весной 5 с включенной защитой - PullRequest
0 голосов
/ 29 марта 2020

У меня возникают проблемы при загрузке данных c, например, изображений, стилей css и т. Д. c .... в пружине 5 при добавлении безопасности, без защиты load ok

Вот как я это сделал.

Сначала , я создаю проект с помощью Spring Starter Project в Eclipse Photon

Spring Boot Version: 2.2.6

Добавить несколько зависимостей:

Spring web

Thymeleaf

Spring Security

Spring Boot DevTools

Spring Boot Actuator

Запустите проект, и я использую сгенерированный пароль безопасности и все в порядке.

Теперь я добавляю статические ресурсы

Так что я создайте папку с именем / assets / imgs

в src / main / resources / static /

В эту папку я добавляю поддельное изображение для использования, называемое fake-image.png

Я создаю класс с пользователем, паролем и шаблонами, чтобы разрешить мои ресурсы.

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

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

        http
        .authorizeRequests().antMatchers("/resources/**", "/static/**","/src/main/resources/**").permitAll().and()
        .formLogin().loginPage("/login").permitAll()
        .usernameParameter("username").passwordParameter("password")
        .defaultSuccessUrl("/loginsuccess").permitAll().and()
        .logout().permitAll();
    }

    @Bean
    public BCryptPasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder builder) throws Exception {

        PasswordEncoder encoder = passwordEncoder();
        UserBuilder users = User.builder().passwordEncoder(encoder::encode);

        //User to login
        builder.inMemoryAuthentication()
                .withUser(users.username("admin").password("q").roles("ADMIN"));

    }

}

Я создаю класс для добавления своей формы входа

@EnableWebMvc
@Configuration
public class WebConfig implements WebMvcConfigurer {

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

}

Наконец, я добавляю логин. html страница, подобная этой, чтобы показать простое изображение

<!DOCTYPE html>
<html lang="es" xmlns="http://www.w3.org/1999/xhtml"
    xmlns:th="http://www.thymeleaf.org">
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />

<meta name="viewport"
    content="width=device-width, initial-scale=1, shrink-to-fit=no" />
<!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
<meta name="description" content="" />
<meta name="author" content="" />

<meta name="ctx" th:content="@{/}" />

<title>Test Static Files</title>

</head>
<body>
    <div class="container">
        <div class="row no-gutters mt-3">
            <div class="col columna-banner">
                <img class="img-fluid rounded login-banner-image"
                    th:src="@{/assets/imgs/fake-image.png}" />
            </div>
        </div>
    </div>
</body>
</html>

В консоли затмения я получаю это предупреждение:

WARN 1434 --- [nio-8080-exe c -2] osweb.servlet.PageNotFound: Нет отображения для GET /assets/imgs/fake-image.png

ОБНОВЛЕНИЕ 1:

Добавлен код для github:

https://github.com/davisoski/stackoverflow-static-files

Я что-то упустил?

Есть предложения?

Спасибо

Ответы [ 3 ]

1 голос
/ 29 марта 2020

кажется, что вы забыли добавить что-то вроде этого

    @Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/static/**")
        .addResourceLocations("classpath:/static/")
        .setCachePeriod(31556926);
}

в ваш класс WebConfig

0 голосов
/ 29 марта 2020

На самом деле 3 вещи, которые нужно знать / учитывать:

  1. Сборка (maven / gradle)

    Без дальнейшей настройки все содержимое sry/main/resources/ папка будет скопирована в ваш "classpath root" (classpath:/).

  2. (Url2Class) Отображение пути

    Текущие весенние загрузки предлагают / предопределяют это свойство:

    (key=)spring.resources.static-locations
    (value=)classpath:/META-INF/resources/, classpath:/resources/, classpath:/static/, classpath:/public/
    (description=)Locations of static resources. Defaults to classpath:[/META-INF/resources/, /resources/, /static/, /public/].
    

    (Значение может быть разделенным запятыми списком (classpath) местоположений.)

    Если Вы используете это также интересно:

    spring.mvc.static-path-pattern
    /**
    Path pattern used for static resources.
    

    (означает: все из spring.resources.static-locations сопоставлено с /**, поэкспериментируйте с этим и своей безопасностью config ...)

    .. для , а точнее:

    spring.webflux.static-path-pattern
    /**
    Path pattern used for static resources.
    

    Итак, до этого момента важно знать, "где находится ваш файл", и по какому URL он будет отображаться / отображаться. Возможны следующие варианты:

    1. (предпочтительно) Соблюдать предварительно определенные местоположения.
    2. Свойство Override spring.resources.static-locations.
    3. (наименее предпочтительно) Введите " custom mapping / hadler ".
  3. Конфигурация безопасности

    Ваша конфигурация безопасности должна соответствовать (что вы хотите разрешить и с чем) какой URL (шаблон) вы хотите использовать. И это обычная практика, чтобы разрешить доступ к ресурсам stati c.


Относительно OP:

src/main/resources/static/assets/* доступно на пути к классам и (по умолчанию) предоставляется через URL /static/assets/*.

Итак, пожалуйста, исправьте в своем файле html: th:src="@{/static/assets/imgs/fake-image.png}". (И на 404 более понятным, сейчас.)

И тогда это должно работать с: .authorizeRequests().antMatchers("/static/**").permitAll().

0 голосов
/ 29 марта 2020

Вы настраиваете местоположение stati c в своих свойствах. например spring.resources.stati c -location = classpath: / static / assets / imgs /

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...