«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.