Сопоставление URL-адресов Spring Boot для статического HTML

Мое приложение Spring Boot в основном будет состоять из двух основных «модулей»:

  • «Веб-модуль», состоящий из статических HTML-страниц, доступных для публики (пользователи, не прошедшие проверку подлинности/анонимные мыши); а также
  • Модуль «Приложение», состоящий из нескольких динамических страниц, каждая из которых требует аутентификации (на основе Spring Security) для доступа.

Базовая структура приложения:

  • index.html: домашняя страница, сопоставленная с http://localhost:8080/
  • about.html: страница "О нас", сопоставленная с http://localhost:8080/about
  • contact.html: страница контактов, сопоставленная с http://localhost:8080/contact
  • login.html: страница входа, сопоставленная с http://localhost:8080/login
  • dashboard.html: информационная панель/целевая страница, на которую вы попадаете после входа в систему, сопоставленная с http://localhost:8080/account.
  • Все остальные страницы под http://localhost:8080/account/* будут MVC/динамическими страницами с типичными @RequestMapping сопоставлениями.

Что мне не ясно, так это то, что для статических («общедоступных» веб-страниц) HTML-страниц я:

  • Просто использовать стандартный @RequestMappings на основе контроллера, который отображает некоторый шаблон Thymeleaf/Handlebars (у которого просто нет модели данных, поскольку содержимое статично)? Или я:
  • Рассматривайте эти страницы как статический контент (так же, как CSS/JS) и обслуживайте их как статический контент, как предписывает Spring Boot? Если это правильный вариант, то как мне добиться правильного сопоставления URL-адресов (например, пользователи могут просто перейти на http://localhost:8080/contact вместо http://localhost:8080/contact.html)?

person smeeb    schedule 28.05.2016    source источник
comment
какую технологию вы используете для аутентификации?   -  person Kamel Mili    schedule 28.05.2016
comment
Спасибо @KamelMili (+1) - Spring Security, возможно, с настраиваемой областью аутентификации/авторизации.   -  person smeeb    schedule 28.05.2016
comment
Тогда Spring Security может справиться с вашей проблемой с помощью веб-игнорирования или сопоставления муравьев, если вам нравится мое решение, я мог бы опубликовать ответ, чтобы показать, как обращаться с классом конфигурации безопасности spring еще, но в любом случае вы будете вынуждены заставить эти страницы работать с тимелеафом, потому что в эти статические веб-страницы представляют собой форму аутентификации, которая обрабатывается тимелеафом и пружинной безопасностью, поэтому, если я правильно понял вашу проблему, вам нужно добавить их в свой преобразователь mvc и добавить игнорирование веб-страниц на эти страницы, чтобы вы могли получить доступ без аутентификации   -  person Kamel Mili    schedule 29.05.2016
comment
Еще раз спасибо @KamelMili (+1) - да, если вы опубликуете ответ, показывающий конкретный пример кода того, как решить эту проблему с помощью Spring Security, этого преобразователя mvc и веб-игнорирования, я бы любезно его принял! Спасибо еще раз!   -  person smeeb    schedule 29.05.2016


Ответы (1)


Хорошо, сначала вам нужно сопоставить свои представления с помощью преобразователя mvc следующим образом:

@Configuration
public class WebMVCconfig extends WebMvcConfigurerAdapter {

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

   }
} 

после сопоставления ваших представлений нам нужно добавить представления, такие как /login в antMatchers, поэтому я предполагаю, что ваш метод конфигурации выглядит следующим образом:

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

    .csrf().disable()   

    .authorizeRequests()
    .antMatchers("/contact","/about", ...).permitAll() //add your static pages here ( public pages ) 
    .anyRequest()
        .authenticated()        
            .and()
            .formLogin()
            .loginPage("/login")
            .permitAll()
            .successHandler(successHandler) // i don't think you'll be needing this it's to redirect the user if it's admin or a simple user 
            .and()  // this is for the logout   
            .logout()
            .invalidateHttpSession(true)
            .logoutUrl("/logout")
            .permitAll();   
}

после добавления вашей карты просмотра в antMatchers spring безопасность не будет обрабатывать аутентификацию для этих страниц, и это решает вашу проблему

person Kamel Mili    schedule 29.05.2016
comment
Большое спасибо @Kamel Mili (+1) - один быстрый вопрос, если вы не возражаете: registry.addViewController("/login") возвращает экземпляр ViewControllerRegistration, чей метод setViewName(...) ожидает строку (например, "login" и т. д.). Какой тип файла представлен этим именем представления (файл HTML, шаблон Thymeleaf и т. д.) и где мне разместить этот файл в моем проекте? Другими словами: какой файл определяет представление "login"? Спасибо еще раз! - person smeeb; 29.05.2016
comment
это простая html-страница, которая начинается так <html xlmns:th="http://www.thymeleaf.org" xml:lang="fr">, и я предполагаю, что вы добавили тимелеаф в свой pom.xml и поместили свои страницы в папку шаблона, чтобы тимлист мог сопоставляться с вашими представлениями. - person Kamel Mili; 30.05.2016
comment
Спасибо @Kamel Mili (+1), но где находится папка шаблона в моем проекте под src/main/resources? Spring нужно знать, где найти представление login... так где (точно) он ищет? Спасибо еще раз! - person smeeb; 30.05.2016
comment
Он находится в разделе src\main\resources\ ps. Вы уверены, что добавили свои зависимости тимелеафа в свой pom.xml? - person Kamel Mili; 30.05.2016
comment
Предполагается, что папка шаблона находится в вашем проекте и не должна быть добавлена, если ваш тип проекта - проект Spring Starter. - person Kamel Mili; 30.05.2016