Настройте logout с любой страницы с использованием возможностей thymeleaf

Безопасность Web-приложения

Этот урок освещает процесс создания простого web-приложения с ресурсами, которые защищены Spring Security.

Что вы создадите

Вы создадите Spring MVC приложение, которое обеспечивает защиту страницы входа фиксированным списком пользователей.

Что вам потребуется

  • Примерно 15 минут свободного времени
  • Любимый текстовый редактор или IDE
  • JDK 6 и выше
  • Gradle 1.11+ или Maven 3.0+
  • Вы также можете импортировать код этого урока, а также просматривать web-страницы прямо из Spring Tool Suite (STS), собственно как и работать дальше из него.

Как проходить этот урок

Как и большинство уроков по Spring, вы можете начать с нуля и выполнять каждый шаг, либо пропустить базовые шаги, которые вам уже знакомы. В любом случае, вы в конечном итоге получите рабочий код.

Чтобы начать с нуля, перейдите в Настройка проекта.

Чтобы пропустить базовые шаги, выполните следующее:

  • Загрузите и распакуйте архив с кодом этого урока, либо кнонируйте из репозитория с помощью Git: git clone https://github.com/spring-guides/gs-securing-web.git
  • Перейдите в каталог gs-securing-web/initial
  • Забегая вперед, настройте Spring Security

Когда вы закончите, можете сравнить получившийся результат с образцом в gs-securing-web/complete .

Настройка проекта

Для начала вам необходимо настроить базовый скрипт сборки. Вы можете использовать любую систему сборки, которая вам нравится для сборки проетов Spring, но в этом уроке рассмотрим код для работы с Gradle и Maven. Если вы не знакомы ни с одним из них, ознакомьтесь с соответсвующими уроками Сборка Java-проекта с использованием Gradle или Сборка Java-проекта с использованием Maven.

Создание структуры каталогов

В выбранном вами каталоге проекта создайте следующую структуру каталогов; к примеру, командой mkdir -p src/main/java/hello для *nix систем:

Создание файла сборки Gradle

Ниже представлен начальный файл сборки Gradle. Файл pom.xml находится здесь. Если вы используете Spring Tool Suite (STS), то можете импортировать урок прямо из него.

Spring Boot gradle plugin предоставляет множество удобных возможностей:

  • Он собирает все jar’ы в classpath и собирает единое, исполняемое «über-jar», что делает более удобным выполнение и доставку вашего сервиса
  • Он ищет public static void main() метод, как признак исполняемого класса
  • Он предоставляет встроенное разрешение зависимостей, с определенными номерами версий для соответсвующих Spring Boot зависимостей. Вы можете переопределить на любые версии, какие захотите, но он будет по умолчанию для Boot выбранным набором версий

Создание незащищенного web приложения

До того, как применить защиту к вашему приложению, вам необходимо само приложение. Шаги в этой главе освещают процесс создания очень простого web-приложения. Затем в следующей главе вы защитите его с помощью Spring Security.

Приложение включает два простых представления: домашнюю страницу и «Hello World» страницу. Домашняя страница предствлена ниже как Thymeleaf шаблон:

Как вы можете увидеть, это простое приложение включает ссылку на страницу «/hello», которая представлена ниже также как Thymeleaf шаблон.

Приложение основано на Spring MVC. Т.о. вам необходимо настроить Spring MVC и контроллеры представлений для отображения этих шаблонов. Ниже конфигурационный класс для настройки Spring MVC в приложении.

Читайте также:  Ниссан альмера н16 дроссельная заслонка не работает

Метод addViewControllers() (переопределение метода с таким же названием в WebMvcConfigurerAdapter ), добавляющий четыре контроллера. Двое из них настроены на представление с именем «home»( home.html ), другой настроен на «hello». Четвертый контроллер настроен на представление с названием «login». Вы создадите это представление в следующей главе.

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

Фундамент простого web-приложения создано, теперь вы можете добавить защиту к нему.

Настройка Spring Security

Предположим, что вы хотите предотвратить неавторизованный доступ к просмотру представления «/hello». Сейчас, если пользователь нажмет на ссылку на домашней странице, он увидит приветствие без каких либо помех к нему. Вам необходимо добавить барьер, который заставляет пользователя войти в систему до того, как он увидит страницу.

Для этого вы настраиваете Spring Security в приложении. Если Spring Security в classpath’е, Spring Boot автоматически обеспечивает защиту для всех HTTP путей с «базовой» аутентификацией. Но вы сможете в дальнейшем изменить под себя настройки безопасности. Первое, что вам нужно сделать, это добавить Spring Security в classpath.

C Gradle это достигается одной строчкой в блоке dependencies :

C Maven — добавлением дополнительного блока в :

Ниже приведена настройка безопасности, которая гарантирует, что только авторизованные пользователи могут увидеть секретное приветствие:

Класс WebSecurityConfig содержит аннотацию @EnableWebMvcSecurity для включения поддержки безопасности Spring Security и Spring MVC интеграцию. Он также расширяет WebSecurityConfigurerAdapter и переопределяет пару методов для установки некоторых настроек безопасности.

Метод configure(HttpSecurity) определяет, какие URL пути должны быть защищены, а какие нет. В частности, «/» и «/home» настроены без требования к авторизации. Ко всем остальным путям должна быть произведена аутентификация.

Когда пользователь успешно войдет в систему, он будет перенаправлен на предыдущую запрашиваемую страницу, требующую авторизацию. Здесь вы определили собственную «/login» страницу в loginPage() и каждый имеет доступ к ней.

Что касается метода configure(AuthenticationManagerBuilder) , то он создает в памяти хранилище пользователей с единственным пользователем. Этому пользователю дано имя «user», пароль «password» и роль «ROLE».

Теперь нам нужно создать страницу входа. Т.к. уже есть сопоставление контроллера с представлением «login», то вам нужно только создать это представления входа:

Как видите, этот Thymeleaf шаблон просто представляет собой форму, которая собирает значения имени пользователя и пароля и отправляет их к «/login». Рассмотрим, как настроен Spring Security фильтр, который перхватывает запрос и идентифицирует пользователя. Если пользователь не прошел проверку, то он будет перенаправлен на страницу «/login?error» и наша страница отобразит соответсвующее сообщение об ошибке. При удачной авторизации, приложение отправит к «/login?logout» и наша страница отобразит соответственное сообщение об успехе.

Последнее, что нам нужно, это предоставить пользователю способ для отображения текущего имени и выхода из системы. Обновим hello.html , чтобы сказать привет текущему пользователю и добавить в форму «Sign Out», как показано ниже:

Мы отображаем имя пользователя с использованием интеграции Spring Security с HttpServletRequest#getRemoteUser() . По кнопке «Sign Out» форма отправляет POST запрос к «/logout». При успешном выходе пользователь будет перенаправлен к «/login?logout».

Создание приложения исполняемым

Несмотря на то, что пакет этого сервиса может быть в составе web-приложения и WAR файлов, более простой подход, продемонстрированный ниже создает отдельное самостоятельное приложение. Вы упаковываете все в единый, исполняемый JAR-файл, который запускается через хорошо знакомый старый main() Java-метод. Попутно, вы используете поддержку Spring для встроенного Tomcat контейнера сервлетов как HTTP среду выполнения вместо развертывания на сторонний экземпляр.

Читайте также:  Где можно отремонтировать автобрелок

main() метод передает управление вспомогательному классу SpringApplication, где Application.class — аргумент его run() метода. Это сообщает Spring о чтении метаданных аннотации из Application и управлении ею как компонента в Spring application context.

Аннотация @ComponentScan говорит Spring’у рекурсивно искать в пакете hello и его потомках классы, помеченные прямо или косвенно Spring аннотацией @Component. Эта директива гарантирует, что Spring найдет и зарегистрирует WebConfig и WebSecurityConfig , потому что он отмечен @Configuration , который, в свою очередь, является своего рода @Component аннотацией. По факту, эти конфигурационные классы также используются для настройки Spring.

Аннотация @EnableAutoConfiguration переключает на приемлемое по умолчанию поведение, основанное на содержании вашего classpath. К примеру, т.к. приложение зависит от встраиваемой версии Tomcat (tomcat-embed-core.jar), Tomcat сервер установлен и сконфигурирован на приемлемое по умолчанию поведение от вашего имени. И т.к. приложение также зависит от Spring MVC (spring-webmvc.jar), Spring MVC DispatcherServlet сконфигурирован и зарегестрирован для вас — web.xml не нужен! Автоконфигурация полезный и гибкий механизм. Подробную информацию смотрите в API документации.

Сборка исполняемого JAR

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

Затем вы можете запустить JAR-файл:

Если вы используете Maven, вы можете запустить приложение, используя mvn spring-boot:run , либо вы можете собрать приложение с mvn clean package и запустить JAR примерно так:

Если вы используете Gradle, вы можете запустить ваш сервис из командной строки:

Как вариант, вы можете запустить ваш сервис напрямую из Gradle примерно так:

как только приложение запустится, откройте в вашем браузере адрес http://localhost:8080. Вы должны увидеть домашнюю страницу:

Когда вы нажмете на ссылку, то она попытается открыть вам сстраницу приветствия /hello . Но т.к. эта страница защищена и вы ещё не вошли в систему, вы увидите страницу входа:

На странице входа войдите под тестовым пользователем, введя «user» и «password» в соответствующие поля. Как только вы отправите форму, вы авторизуетесь и увидите страницу приветствия:

Если вы нажмете на кнопку «Sign Out», ваша авторизация отменится и вы вернетесь к странице входа с сообщением о том, что вы вышли из системы.

Поздравляем! Вы только что разработали простое web-приложение, которое защищено Spring Security.

Источник

Thymeleaf

Thymeleaf + Spring Security integration basics

Have you switched to Thymeleaf but your login and error pages are still using JSP? In this article we will see how to configure your Spring application to use Thymeleaf for login and error pages.

All the code seen here comes from a working application. You can view or download the source code from its GitHub repo.

Note that the Thymeleaf integration packages for Spring Security support both Spring MVC and Spring WebFlux applications since Spring Security 5, but this article will focus on a Spring MVC configuration.

Читайте также:  Стеклоподъемник задней двери сломался

Prerequisites

We asume you are familiar with Thymeleaf and Spring Security, and you have a working application using these technologies. If you don’t know Spring Security, you could be interested on reading the Spring Security Documentation.

Login pages

With Spring Security you could specify any URL to act as a login page, just like:

Now we have to match these pages inside a Spring Controller:

Note that we are using the same template login.html for both pages, but when there is an error, we set a boolean attribute into the model.

Our login.html template is as follows:

Error page

We can also configure an error page based on Thymeleaf. In this case Spring Security is not involved at all, we should simply add an ExceptionHandler to our Spring configuration like:

The error.html template could be like:

Note how we are using Spring’s HttpStatus enum in order to obtain detailed information about the response status that has been set (which in this case will always be 500 , but this allows us to use this error.html in other error reporting scenarios).

Spring Security Dialect

In Spring MVC environments, the Spring Security integration module works as a replacement of the Spring security taglib.

We use this dialect in the example in order to print the logged user credentials and to show different content to different roles.

The sec:authorize attribute renders its content when the attribute expression is evaluated to true:

The sec:authentication attribute is used to print logged user name and roles:

Источник

Настройте logout с любой страницы с использованием возможностей thymeleaf

Java pre-project. Практическая задача 2.4.2

Initial login data is admin : admin

Модуль Spring Security позволяет нам внедрять права доступа, а также контролировать их исполнение без ручных проверок.

Spring Security базируется на 2х интерфейсах, которые определяют связь сущностей с секьюрностью: UserDetails и GrantedAuthority.

UserDetails — то, что будет интерпретироваться системой как пользователь.

GrantedAuthority — сущность, описывающая права юзера.

Оба эти интерфейса имеют множество реализаций: просмотрите класс SecurityConfig, в методе configure() с помощью настроек inMemoryAuthentication() мы собираем единственный на всю программу экземпляр UserDetails с именем и паролем админ-админ, а его роль “ADMIN” так же будет преобразована в экземпляр GrantedAuthority.

Это простейший способ создания секьюрности. Так же мы можем использовать jdbc-аутентификацию путем написания запроса, возвращающего пользователя и роль.

Как вы понимаете, такие способы максимально просты, но лишены достаточной гибкости, потому наиболее часто используемый вариант настройки выглядит как имплементация UserDetails и GrantedAuthority в классах-сущностях с переопределением существующих методов.

Рассмотрим приложение

  • SpringSecurityInitializer — обязателен для не boot-приложения. Кода в нем нет, но требуется для регистрации секьюрити в Спринг-контейнере.
  • SecurityConfig — настройка секьюрности по определенным URL, а также настройка UserDetails и GrantedAuthority.
  • LoginSuccessHandler — хэндлер, содержащий в себе алгоритм действий при успешной аутентификации. Например, тут мы можем отправить пользователя с ролью админа на админку после логина, а с ролью юзер на главную страницу сайта и т.п.

Источник

Оцените статью