«1. Обзор
В этом кратком руководстве мы сосредоточимся на Spring Security с Thymeleaf. Мы собираемся создать приложение Spring Boot, в котором продемонстрируем использование диалекта безопасности.
В качестве технологии внешнего интерфейса мы выбрали Thymeleaf — современный механизм веб-шаблонов на стороне сервера с хорошей интеграцией с инфраструктурой Spring MVC. Для получения более подробной информации, пожалуйста, посмотрите нашу вступительную статью об этом.
Наконец, Spring Security Dialect — это дополнительный модуль Thymeleaf, который, естественно, помогает интегрировать их вместе.
Мы собираемся использовать простой проект, который мы создали в нашей учебной статье по Spring Boot; у нас также есть учебник Thymeleaf с Spring, где можно найти стандартную конфигурацию Thymeleaf.
2. Зависимости
Прежде всего, давайте добавим новую зависимость в наш Maven pom.xml:
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-springsecurity5</artifactId>
</dependency>
Рекомендуется всегда использовать последнюю версию, которую мы можем получить на Maven Central .
3. Конфигурация Spring Security
Далее давайте определим конфигурацию Spring Security.
Нам также нужны как минимум два разных пользователя для демонстрации использования диалекта безопасности:
@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
// [...]
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth)
throws Exception {
auth
.inMemoryAuthentication()
.withUser("user").password(passwordEncoder().encode("password")).roles("USER")
.and()
.withUser("admin").password(passwordEncoder().encode("admin")).roles("ADMIN");
}
@Bean
public BCryptPasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
Как мы видим, в configureGlobal(AuthenticationManagerBuilder auth) мы определяем двух пользователей с именем пользователя и паролем. Мы можем использовать их для доступа к нашему приложению.
Наши пользователи имеют разные роли: АДМИНИСТР и ПОЛЬЗОВАТЕЛЬ соответственно, поэтому мы можем предоставлять им определенный контент в зависимости от роли.
4. Диалект безопасности
Диалект безопасности Spring позволяет нам условно отображать контент на основе ролей пользователей, разрешений или других выражений безопасности. Это также дает нам доступ к объекту Spring Authentication.
Давайте посмотрим на индексную страницу, содержащую примеры диалекта безопасности:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Welcome to Spring Security Thymeleaf tutorial</title>
</head>
<body>
<h2>Welcome</h2>
<p>Spring Security Thymeleaf tutorial</p>
<div sec:authorize="hasRole('USER')">Text visible to user.</div>
<div sec:authorize="hasRole('ADMIN')">Text visible to admin.</div>
<div sec:authorize="isAuthenticated()">
Text visible only to authenticated users.
</div>
Authenticated username:
<div sec:authentication="name"></div>
Authenticated user roles:
<div sec:authentication="principal.authorities"></div>
</body>
</html>
Мы можем увидеть атрибуты, характерные для диалекта безопасности Spring: sec:authorize и sec:authentication.
Давайте обсудим их один за другим.
4.1. Понимание sec:authorize
Проще говоря, мы используем атрибут sec:authorize для управления отображаемым содержимым.
Например, если мы хотим показывать контент только пользователю с ролью USER, мы можем сделать: \u003cdiv sec:authorize=†hasRole(“USER’)” \u003e.
И, если мы хотим расширить доступ для всех аутентифицированных пользователей, мы можем использовать следующее выражение:
\u003cdiv sec:authorize=“isAuthenticated()” \u003e.
4.2. Понимание sec:authentication
Интерфейс Spring Security Authentication предоставляет полезные методы, касающиеся аутентифицированного принципала или запроса аутентификации.
Чтобы получить доступ к объекту аутентификации с помощью Thymeleaf, мы можем просто использовать \u003cdiv sec:authentication=“name” \u003e или \u003cdiv sec:authentication=“principal.authorities” \u003e.
Первое дает нам доступ к имени аутентифицированного пользователя, второе позволяет нам получить доступ к ролям аутентифицированного пользователя.
5. Резюме
В этой статье мы использовали поддержку Spring Security в Thymeleaf в простом приложении Spring Boot.
Как всегда, рабочая версия кода, показанного в этой статье, доступна в нашем репозитории GitHub.