enrollments;
+```
+
+В этом сценарии мы выбираем ленивую загрузку (`FetchType.LAZY`). Поскольку нам не всегда нужно получать доступ ко всем записям курса, ленивая загрузка гарантирует, что записи будут извлечены только при явном запросе.
+
+---
+
+# [Далее: Создание Репозитория](../interacting/repository.md)
diff --git a/docs/ru/jpa/practice/creation/relationships.md b/docs/ru/jpa/practice/creation/relationships.md
new file mode 100644
index 0000000..9040aab
--- /dev/null
+++ b/docs/ru/jpa/practice/creation/relationships.md
@@ -0,0 +1,44 @@
+# Определение Связей Между Сущностями
+
+## Введение
+
+Это руководство посвящено пониманию и реализации связей между сущностями в проекте Spring Boot с использованием JPA (Java Persistence API). Конкретно мы рассмотрим отношение между сущностью `Enrollment` и ее связанными сущностями `Student` и `Course`.
+
+## Цель
+
+Цель этого руководства - предоставить четкие инструкции по определению и пониманию связей сущностей в проекте Spring Boot с JPA. К концу этого руководства вы поймете, как установить ассоциации между сущностями и реализовать их в вашем приложении.
+
+## Связи Между Сущностями
+
+
+### Характеристики Сущности Enrollment:
+
+- `id` (UUID): Первичный ключ для сущности.
+- `student` (Student): Студент, связанный с записью на курс.
+- `course` (Course): Курс, связанный с записью на курс.
+- `enrollmentDate` (Date): Дата записи на курс.
+- `grade` (int): Оценка, полученная за курс.
+
+#### Отношение со Студентом
+
+Отношение между сущностью `Enrollment` и сущностью `Student` представляет собой сценарий, когда студент записывается на курс. Это отношение Многие-к-Одному, где много записей на курс может быть связано с одним студентом. Чтобы установить это отношение, аннотируйте атрибут `student` в сущности `Enrollment` аннотацией `@ManyToOne`.
+
+```java
+@ManyToOne
+@JoinColumn(name = "student_id")
+private Student student;
+```
+
+#### Отношение с Курсом
+
+Аналогично отношение между сущностью `Enrollment` и сущностью `Course` означает сценарий, когда на курс записывается несколько студентов. Это также отношение Многие-к-Одному, где много записей на курс может быть связано с одним курсом. Аннотируйте атрибут `course` в сущности `Enrollment` аннотацией `@ManyToOne`.
+
+```java
+@ManyToOne
+@JoinColumn(name = "course_id")
+private Course course;
+```
+
+---
+
+# [Далее: Стратегии Извлечения](fetching.md)
diff --git a/docs/ru/jpa/practice/dependencies/driver.md b/docs/ru/jpa/practice/dependencies/driver.md
new file mode 100644
index 0000000..5867be1
--- /dev/null
+++ b/docs/ru/jpa/practice/dependencies/driver.md
@@ -0,0 +1,100 @@
+# JPA: Настройка зависимостей
+
+## Введение
+
+Это руководство сосредотачивается на настройке зависимостей для проекта Spring Boot с использованием JPA (Java Persistence API). Оно охватывает необходимые шаги по включению драйверов базы данных для различных баз данных, таких как PostgreSQL, MySQL, Oracle, MongoDB и Microsoft SQL Server. Следуя этому руководству, вы настроите все необходимые зависимости для установления соединений с этими базами данных в вашем приложении Spring Boot.
+
+## Цель
+
+Цель этого руководства - предоставить четкие инструкции по настройке необходимых зависимостей для Spring Boot и JPA, с особенным акцентом на драйверах баз данных для различных баз данных.
+
+## Настройка зависимостей
+
+### Драйверы баз данных
+
+Для подключения к различным базам данных в вашем приложении Spring Boot включите соответствующие драйверы баз данных.
+
+#### PostgreSQL
+
+**Для Gradle:**
+```groovy
+implementation "org.postgresql:postgresql"
+```
+
+**Для Maven:**
+```xml
+
+ org.postgresql
+ postgresql
+ INSERT_VERSION_HERE
+
+```
+
+#### MySQL
+
+**Для Gradle:**
+```groovy
+implementation "mysql:mysql-connector-java"
+```
+
+**Для Maven:**
+```xml
+
+ mysql
+ mysql-connector-java
+ INSERT_VERSION_HERE
+
+```
+
+#### Драйвер Oracle Database
+
+**Для Gradle:**
+```groovy
+implementation 'com.oracle.database.jdbc:ojdbc8'
+```
+
+**Для Maven:**
+```xml
+
+ com.oracle.database.jdbc
+ ojdbc8
+
+```
+
+#### Драйвер MongoDB (MongoDB Java Driver)
+
+**Для Gradle:**
+```groovy
+implementation 'org.mongodb:mongodb-driver-sync:4.4.3'
+```
+
+**Для Maven:**
+```xml
+
+ org.mongodb
+ mongodb-driver-sync
+ 4.4.3
+
+```
+
+#### Драйвер Microsoft SQL Server JDBC
+
+**Для Gradle:**
+```groovy
+implementation 'com.microsoft.sqlserver:mssql-jdbc:9.4.0.jre11'
+```
+
+**Для Maven:**
+```xml
+
+ com.microsoft.sqlserver
+ mssql-jdbc
+ 9.4.0.jre11
+
+```
+
+Эти зависимости облегчают подключение к базам данных.
+
+---
+
+# [Далее: JPA Настройка зависимостей](jpa.md)
\ No newline at end of file
diff --git a/docs/ru/jpa/practice/dependencies/jpa.md b/docs/ru/jpa/practice/dependencies/jpa.md
new file mode 100644
index 0000000..4f68d7a
--- /dev/null
+++ b/docs/ru/jpa/practice/dependencies/jpa.md
@@ -0,0 +1,183 @@
+# Настройка зависимостей JPA
+
+## Введение
+
+Это руководство сосредоточено на настройке зависимостей для проекта Spring Boot с использованием JPA (Java Persistence API). Оно охватывает необходимые шаги для включения зависимостей Spring Boot Starter JDBC и Spring Boot Starter Data JPA.
+
+## Цель
+
+Цель этого руководства - предоставить четкие инструкции по настройке необходимых зависимостей для Spring Boot и JPA, с акцентом на зависимостях Spring Boot Starter JDBC и Spring Boot Starter Data JPA.
+
+## Настройка зависимостей
+
+### Spring Boot Starter JDBC
+
+Для включения поддержки JDBC в вашем приложении Spring Boot:
+
+#### Gradle
+
+```groovy
+implementation "org.springframework.boot:spring-boot-starter-jdbc"
+```
+
+#### Maven
+
+```xml
+
+ org.springframework.boot
+ spring-boot-starter-jdbc
+
+```
+
+Эта зависимость обеспечивает автоконфигурацию для доступа к данным на основе JDBC.
+
+### Spring Boot Starter Data JPA
+
+Для включения поддержки JPA (Java Persistence API) в вашем приложении Spring Boot:
+
+#### Gradle
+
+```groovy
+implementation "org.springframework.boot:spring-boot-starter-data-jpa"
+```
+
+#### Maven
+
+```xml
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+```
+
+Эта зависимость упрощает настройку репозиториев на основе JPA и предоставляет конфигурации по умолчанию для Hibernate.
+
+### Дополнительная конфигурация для Spring WebMVC
+
+Если вы используете Spring WebMVC, вам необходимо добавить дополнительную конфигурацию для настройки бинов и свойств, связанных с сохранением состояния.
+
+#### Создание класса конфигурации Persistence
+
+Создайте новый класс с именем `PersistenceConfig` в пакете `com.example.config`:
+
+```java
+package com.example.config;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
+import org.springframework.jdbc.datasource.DriverManagerDataSource;
+import org.springframework.orm.jpa.JpaTransactionManager;
+import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
+import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
+import org.springframework.transaction.PlatformTransactionManager;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+import javax.persistence.EntityManagerFactory;
+import javax.sql.DataSource;
+
+/**
+ * Класс конфигурации для настройки бинов и свойств, связанных с сохранением состояния.
+ *
+ *
+ * Этот класс настраивает источник данных, фабрику менеджеров сущностей и менеджер транзакций для JPA.
+ * Он считывает свойства подключения к базе данных из внешнего файла свойств.
+ *
+ */
+@Configuration
+@EnableTransactionManagement
+@EnableJpaRepositories(basePackages = "com.example.repository")
+@PropertySource({"classpath:application.properties"})
+public class PersistenceConfig {
+
+ @Value("${spring.datasource.driver}")
+ private String dbDriver;
+
+ @Value("${spring.datasource.url}")
+ private String dbUrl;
+
+ @Value("${spring.datasource.username}")
+ private String dbUsername;
+
+ @Value("${spring.datasource.password}")
+ private String dbPassword;
+
+ @Value("${spring.jpa.properties.hibernate.dialect}")
+ private String hibernateDialect;
+
+ @Value("${spring.jpa.properties.hibernate.show_sql}")
+ private boolean hibernateShowSql;
+
+ @Value("${spring.jpa.hibernate.ddl-auto}")
+ private String hibernateHbm2ddlAuto;
+
+ /**
+ * Определение бина DataSource.
+ *
+ *
+ * Этот метод настраивает источник данных, используя свойства, определенные в файле application.properties.
+ *
+ *
+ * @return Бин DataSource
+ */
+ @Bean
+ public DataSource dataSource() {
+ DriverManagerDataSource dataSource = new DriverManagerDataSource();
+ dataSource.setDriverClassName(dbDriver);
+ dataSource.setUrl(dbUrl);
+ dataSource.setUsername(dbUsername);
+ dataSource.setPassword(dbPassword);
+ return dataSource;
+ }
+
+ /**
+ * Определение бина EntityManagerFactory.
+ *
+ *
+ * Этот метод настраивает фабрику менеджеров сущност
+
+ей с использованием настроенного источника данных и свойств Hibernate.
+ *
+ *
+ * @param dataSource бин источника данных
+ * @return Бин EntityManagerFactory
+ */
+ @Bean
+ public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) {
+ LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
+ em.setDataSource(dataSource);
+ em.setPackagesToScan("com.example.entity");
+
+ HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
+ vendorAdapter.setDatabasePlatform(hibernateDialect);
+ vendorAdapter.setShowSql(hibernateShowSql);
+ vendorAdapter.setGenerateDdl("update".equalsIgnoreCase(hibernateHbm2ddlAuto));
+ em.setJpaVendorAdapter(vendorAdapter);
+
+ return em;
+ }
+
+ /**
+ * Определение бина TransactionManager Spring.
+ *
+ *
+ * Этот метод настраивает менеджер транзакций для JPA с использованием настроенной фабрики менеджеров сущностей.
+ *
+ *
+ * @param entityManagerFactory бин фабрики менеджеров сущностей
+ * @return Бин TransactionManager
+ */
+ @Bean
+ public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
+ JpaTransactionManager txManager = new JpaTransactionManager();
+ txManager.setEntityManagerFactory(entityManagerFactory);
+ return txManager;
+ }
+}
+```
+
+---
+
+# [Следующий: Создание сущностей](../creation/create-entity.md)
\ No newline at end of file
diff --git a/docs/ru/jpa/practice/interacting/jpa-repository.md b/docs/ru/jpa/practice/interacting/jpa-repository.md
new file mode 100644
index 0000000..fd57f6f
--- /dev/null
+++ b/docs/ru/jpa/practice/interacting/jpa-repository.md
@@ -0,0 +1,52 @@
+# Создание JpaRepository
+
+## Введение
+
+Это руководство демонстрирует, как создать репозиторий для управления сущностями в проекте Spring Boot с использованием JPA (Java Persistence API) с помощью JpaRepository.
+
+## Цель
+
+Цель этого руководства - предоставить четкие инструкции по настройке репозитория для управления сущностями в приложении Spring Boot. По окончании этого руководства вы сможете создать классы репозитория и сервиса для сущности `Course`.
+
+## Структура каталогов
+
+```
+src/
+└── main/
+ └── java/
+ └── com/
+ └── example/
+ └── demo/
+ ├── data/
+ │ └── entities/
+ │ ├── Student.java
+ │ ├── Enrollment.java
+ │ └── Course.java
+ └── repository/
+ ├── StudentRepository.java
+ └── CourseRepository.java
+
+```
+
+## Класс репозитория
+
+### CourseRepository.java
+
+```java
+package com.yourcompany.yourproject.repository;
+
+import com.yourcompany.yourproject.model.Course;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface CourseRepository extends JpaRepository {
+ // Добавьте методы репозитория для сущности курса
+}
+```
+
+Аннотация `@Repository` является аннотацией стереотипа Spring, используемой для указания того, что декорированный класс является компонентом репозитория в слое доступа к данным. Она служит маркером для любого класса, который выполняет роль репозитория, облегчая перевод исключений в едиерное иерархия исключений Spring.
+
+---
+
+# [Далее: Создание записи](jpa-repository/create.md)
diff --git a/docs/ru/jpa/practice/interacting/jpa-repository/create.md b/docs/ru/jpa/practice/interacting/jpa-repository/create.md
new file mode 100644
index 0000000..eda726e
--- /dev/null
+++ b/docs/ru/jpa/practice/interacting/jpa-repository/create.md
@@ -0,0 +1,38 @@
+# Создание записей в таблице с использованием JpaRepository
+
+## Введение
+
+Это руководство демонстрирует, как создавать записи в таблице, используя слой репозитория в приложении Spring Boot с JPA (Java Persistence API) и JpaRepository.
+
+## Цель
+
+Цель этого руководства - проиллюстрировать процесс создания записей в таблице путем реализации метода в интерфейсе `CourseRepository` с использованием JpaRepository.
+
+## Метод репозитория
+
+### CourseRepository.java
+
+```java
+package com.example.demo.repository;
+
+import com.example.demo.data.entities.Course;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+import java.util.UUID;
+
+@Repository
+public interface CourseRepository extends JpaRepository {
+
+ Course save(Course course);
+}
+```
+
+### Объяснение
+
+Метод `save(Course course)`, предоставленный JpaRepository, позволяет нам сохранить новую запись в таблице `Course`.
+
+Вызывая этот метод и передавая объект `Course` в качестве параметра, JpaRepository автоматически обрабатывает процесс сохранения сущности в базе данных.
+
+---
+
+# [Далее: Чтение записи](read.md)
diff --git a/docs/ru/jpa/practice/interacting/jpa-repository/delete.md b/docs/ru/jpa/practice/interacting/jpa-repository/delete.md
new file mode 100644
index 0000000..adea12c
--- /dev/null
+++ b/docs/ru/jpa/practice/interacting/jpa-repository/delete.md
@@ -0,0 +1,41 @@
+# Удаление записей из таблицы с использованием JpaRepository
+
+## Введение
+
+В этом руководстве показано, как удалять записи из таблицы, используя слой репозитория в приложении Spring Boot с JPA (Java Persistence API) и JpaRepository.
+
+## Цель
+
+Цель этого руководства - проиллюстрировать процесс удаления записей из таблицы путем реализации метода в интерфейсе `CourseRepository` с использованием JpaRepository.
+
+## Метод репозитория
+
+### CourseRepository.java
+
+```java
+package com.example.demo.repository;
+
+import com.example.demo.data.entities.Course;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+import java.util.UUID;
+
+@Repository
+public interface CourseRepository extends JpaRepository {
+
+ void deleteById(UUID id);
+}
+```
+
+## Объяснение
+
+Метод `deleteById(UUID id)` следует соглашению, распознаваемому JpaRepository, для удаления записей на основе их уникального идентификатора.
+
+- Ключевое слово `delete` указывает, что этот метод используется для удаления данных.
+- `ById` указывает критерий для идентификации записи, которую нужно удалить. В данном случае мы нацелены на запись с определенным идентификатором.
+
+Следуя этому соглашению по именованию, JpaRepository автоматически генерирует соответствующий SQL-запрос для удаления желаемой записи из базы данных. Это упрощает процесс разработки, устраняя необходимость писать явные SQL-запросы на удаление, что позволяет разработчикам сосредоточиться на определении сигнатур методов, отражающих предполагаемые операции удаления данных.
+
+---
+
+# [Далее: Пользовательский запрос](query.md)
diff --git a/docs/ru/jpa/practice/interacting/jpa-repository/query.md b/docs/ru/jpa/practice/interacting/jpa-repository/query.md
new file mode 100644
index 0000000..5d2c4b5
--- /dev/null
+++ b/docs/ru/jpa/practice/interacting/jpa-repository/query.md
@@ -0,0 +1,43 @@
+# Пользовательский запрос с использованием JpaRepository
+
+## Введение
+
+Это руководство демонстрирует, как реализовать методы пользовательского запроса, используя аннотацию `@Query` в слое репозитория приложения Spring Boot с JPA (Java Persistence API) и JpaRepository.
+
+## Цель
+
+Цель этого руководства - проиллюстрировать процесс создания методов пользовательского запроса в интерфейсе репозитория для выполнения определенных операций с базой данных, адаптированных к требованиям приложения.
+
+## Метод репозитория
+
+### CourseRepository.java
+
+```java
+package com.example.demo.repository;
+
+import com.example.demo.data.entities.Course;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+import java.util.List;
+
+@Repository
+public interface CourseRepository extends JpaRepository {
+
+ @Query("SELECT c FROM Course c WHERE c.instructor = :instructor")
+ List findCoursesByInstructor(@Param("instructor") String instructor);
+}
+```
+
+### Объяснение
+
+Аннотация `@Query` позволяет нам определять пользовательские запросы JPQL (Java Persistence Query Language) непосредственно в интерфейсе репозитория.
+
+- `"SELECT c FROM Course c WHERE c.instructor = :instructor"` - это запрос JPQL, который выбирает все курсы, где имя инструктора соответствует предоставленному значению.
+- Аннотация `@Param("instructor")` привязывает параметр метода `instructor` к именованному параметру `:instructor` в запросе JPQL.
+
+Используя `@Query`, мы можем создавать сложные запросы, адаптированные к конкретным потребностям извлечения данных, обеспечивая гибкость и контроль над операциями с базой данных.
+
+---
+
+# [Next: Tasks](../../../lab-work.md)
\ No newline at end of file
diff --git a/docs/ru/jpa/practice/interacting/jpa-repository/read.md b/docs/ru/jpa/practice/interacting/jpa-repository/read.md
new file mode 100644
index 0000000..7cd66e0
--- /dev/null
+++ b/docs/ru/jpa/practice/interacting/jpa-repository/read.md
@@ -0,0 +1,42 @@
+# Чтение записей из таблицы с использованием JpaRepository
+
+## Введение
+
+Это руководство демонстрирует, как извлекать данные из таблицы, используя слой репозитория в приложении Spring Boot с JPA (Java Persistence API) и JpaRepository.
+
+## Цель
+
+Цель этого руководства - проиллюстрировать процесс чтения данных из таблицы путем реализации метода в интерфейсе `CourseRepository` с использованием JpaRepository.
+
+## Метод репозитория
+
+### CourseRepository.java
+
+```java
+package com.example.demo.repository;
+
+import com.example.demo.data.entities.Course;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+import java.util.List;
+
+@Repository
+public interface CourseRepository extends JpaRepository {
+
+ List findCoursesByInstructor(String instructor);
+}
+```
+
+### Объяснение
+
+Сигнатура метода `findCoursesByInstructor(String instructor)` следует определенному соглашению по именованию, распознаваемому Spring Data JPA.
+
+- Ключевое слово `find` указывает, что этот метод используется для извлечения данных.
+- `Courses` представляет тип сущности, который мы хотим извлечь.
+- `ByInstructor` указывает критерий для фильтрации результатов. В данном случае мы запрашиваем курсы на основе атрибута `instructor`.
+
+Следуя этому соглашению по именованию, Spring Data JPA автоматически генерирует соответствующий SQL-запрос за кулисами, чтобы извлечь необходимые данные из базы данных. Это упрощает процесс разработки, устраняя необходимость писать явные SQL-запросы, что позволяет разработчикам сосредоточиться на определении сигнатур методов, отражающих желаемые операции извлечения данных.
+
+---
+
+# [Далее: Удаление записи](delete.md)
diff --git a/docs/ru/jpa/practice/interacting/repository.md b/docs/ru/jpa/practice/interacting/repository.md
new file mode 100644
index 0000000..16e82e1
--- /dev/null
+++ b/docs/ru/jpa/practice/interacting/repository.md
@@ -0,0 +1,50 @@
+# Создание репозитория
+
+## Введение
+
+Это руководство демонстрирует, как создать репозиторий для управления сущностями в проекте Spring Boot с использованием JPA (Java Persistence API).
+
+## Цель
+
+Цель этого руководства - предоставить четкие инструкции по настройке репозитория для управления сущностями в приложении Spring Boot. По окончании этого руководства вы сможете создать репозиторий для сущности `Student`.
+
+## Структура каталогов
+
+```
+src/
+└── main/
+ └── java/
+ └── com/
+ └── example/
+ └── demo/
+ ├── data/
+ │ └── entites/
+ │ ├── Student.java
+ │ ├── Enrollment.java
+ │ └── Course.java
+ └── repository/
+ └── StudentRepository.java
+
+```
+
+## Класс репозитория
+
+### StudentRepository.java
+
+```java
+package com.yourcompany.yourproject.repository;
+
+import com.yourcompany.yourproject.model.Student;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public class StudentRepository {
+ // Добавьте методы репозитория для сущности студента
+}
+```
+
+Аннотация `@Repository` является аннотацией стереотипа Spring, используемой для указания того, что декорированный класс является компонентом репозитория в слое доступа к данным. Она служит маркером для любого класса, который выполняет роль репозитория, облегчая перевод исключений в едиерное иерархия исключений Spring.
+
+---
+
+# [Далее: Создание записи](repository/create.md)
diff --git a/docs/ru/jpa/practice/interacting/repository/create.md b/docs/ru/jpa/practice/interacting/repository/create.md
new file mode 100644
index 0000000..8fbbbf9
--- /dev/null
+++ b/docs/ru/jpa/practice/interacting/repository/create.md
@@ -0,0 +1,46 @@
+# Создание новых записей в таблице с использованием слоя репозитория
+
+## Введение
+
+Это руководство иллюстрирует, как создавать новые записи в таблице, используя слой репозитория в приложении Spring Boot с JPA (Java Persistence API).
+
+## Цель
+
+Цель этого руководства - продемонстрировать процесс создания новых записей в таблице с использованием слоя репозитория. Мы достигнем этого, реализовав метод в интерфейсе `StudentRepository`, используя `EntityManager` вместо `JpaRepository`.
+
+## Метод репозитория
+
+### StudentRepository.java
+
+```java
+package com.example.demo.repository;
+
+import com.example.demo.data.entities.Student;
+import org.springframework.stereotype.Repository;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.transaction.Transactional;
+
+@Repository
+public class StudentRepository {
+
+ @PersistenceContext
+ private EntityManager entityManager;
+
+ public void saveStudent(Student student) {
+ entityManager.persist(student);
+ }
+}
+```
+
+### Объяснение
+
+- `@Repository`: Эта аннотация помечает класс как компонент репозитория в слое доступа к данным.
+
+- `@PersistenceContext`: Эта аннотация используется для внедрения экземпляра EntityManager в класс репозитория.
+
+- `entityManager.persist(student)`: Этот код сохраняет новую сущность `Student` в базе данных.
+
+---
+
+# [Далее: Чтение записи](read.md)
diff --git a/docs/ru/jpa/practice/interacting/repository/delete.md b/docs/ru/jpa/practice/interacting/repository/delete.md
new file mode 100644
index 0000000..c6ade0d
--- /dev/null
+++ b/docs/ru/jpa/practice/interacting/repository/delete.md
@@ -0,0 +1,47 @@
+# Удаление записей из таблицы с использованием слоя репозитория
+
+## Введение
+
+В этом руководстве показано, как удалять записи из таблицы, используя слой репозитория в приложении Spring Boot с JPA (Java Persistence API).
+
+## Цель
+
+Цель этого руководства - продемонстрировать процесс удаления записей из таблицы, реализовав метод в интерфейсе `StudentRepository` с использованием `EntityManager`.
+
+## Метод репозитория
+
+### StudentRepository.java
+
+```java
+package com.example.demo.repository;
+
+import com.example.demo.data.entities.Student;
+import org.springframework.stereotype.Repository;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.transaction.Transactional;
+
+@Repository
+public class StudentRepository {
+
+ @PersistenceContext
+ private EntityManager entityManager;
+
+ public void deleteStudent(UUID id) {
+ Student studentToDelete = entityManager.find(Student.class, id);
+ entityManager.remove(studentToDelete);
+ }
+}
+```
+
+### Объяснение
+
+- `@Repository`: Эта аннотация помечает класс как компонент репозитория в слое доступа к данным.
+
+- `@PersistenceContext`: Эта аннотация используется для внедрения экземпляра EntityManager в класс репозитория.
+
+- `entityManager.remove(studentToDelete)`: Этот код удаляет сущность `Student` из базы данных.
+
+---
+
+# [Далее: Пользовательский запрос](query.md)
diff --git a/docs/ru/jpa/practice/interacting/repository/query.md b/docs/ru/jpa/practice/interacting/repository/query.md
new file mode 100644
index 0000000..b25f84d
--- /dev/null
+++ b/docs/ru/jpa/practice/interacting/repository/query.md
@@ -0,0 +1,48 @@
+# Создание пользовательских запросов в таблице с использованием слоя репозитория
+
+## Введение
+
+В этом руководстве показано, как создавать пользовательские запросы для извлечения записей из таблицы, используя слой репозитория в приложении Spring Boot с JPA (Java Persistence API).
+
+## Цель
+
+Цель этого руководства - проиллюстрировать процесс создания пользовательских запросов для извлечения записей из таблицы, реализовав метод в интерфейсе `StudentRepository` с использованием `EntityManager`.
+
+## Метод репозитория
+
+### StudentRepository.java
+
+```java
+package com.example.demo.repository;
+
+import com.example.demo.data.entities.Student;
+import org.springframework.stereotype.Repository;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import java.util.List;
+
+@Repository
+public class StudentRepository {
+
+ @PersistenceContext
+ private EntityManager entityManager;
+
+ public List findStudentsByMajor(String major) {
+ return entityManager.createQuery("SELECT s FROM Student s WHERE s.major = :major", Student.class)
+ .setParameter("major", major)
+ .getResultList();
+ }
+}
+```
+
+### Объяснение
+
+- `@Repository`: Эта аннотация помечает класс как компонент репозитория в слое доступа к данным.
+
+- `@PersistenceContext`: Эта аннотация используется для внедрения экземпляра EntityManager в класс репозитория.
+
+- `entityManager.createQuery(...)`: Этот код создает пользовательский запрос на JPQL (Java Persistence Query Language) для извлечения записей на основе предоставленного критерия (`major` в этом примере).
+
+---
+
+# [Далее: Создание JpaRepository](../jpa-repository.md)
diff --git a/docs/ru/jpa/practice/interacting/repository/read.md b/docs/ru/jpa/practice/interacting/repository/read.md
new file mode 100644
index 0000000..36e6af3
--- /dev/null
+++ b/docs/ru/jpa/practice/interacting/repository/read.md
@@ -0,0 +1,46 @@
+# Чтение записей из таблицы с использованием слоя репозитория
+
+## Введение
+
+В этом руководстве показано, как читать записи из таблицы, используя слой репозитория в приложении Spring Boot с JPA (Java Persistence API).
+
+## Цель
+
+Цель этого руководства - проиллюстрировать процесс чтения записей из таблицы, реализовав метод в интерфейсе `StudentRepository` с использованием `EntityManager`.
+
+## Метод репозитория
+
+### StudentRepository.java
+
+```java
+package com.example.demo.repository;
+
+import com.example.demo.data.entities.Student;
+import org.springframework.stereotype.Repository;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import java.util.UUID;
+
+@Repository
+public class StudentRepository {
+
+ @PersistenceContext
+ private EntityManager entityManager;
+
+ public Student findStudentById(UUID id) {
+ return entityManager.find(Student.class, id);
+ }
+}
+```
+
+### Объяснение
+
+- `@Repository`: Эта аннотация помечает класс как компонент репозитория в слое доступа к данным.
+
+- `@PersistenceContext`: Эта аннотация используется для внедрения экземпляра EntityManager в класс репозитория.
+
+- `entityManager.find(Student.class, id)`: Этот код извлекает сущность `Student` из базы данных на основе предоставленного `id`.
+
+---
+
+# [Далее: Обновление записи](update.md)
diff --git a/docs/ru/jpa/practice/interacting/repository/update.md b/docs/ru/jpa/practice/interacting/repository/update.md
new file mode 100644
index 0000000..2fe9b31
--- /dev/null
+++ b/docs/ru/jpa/practice/interacting/repository/update.md
@@ -0,0 +1,46 @@
+# Обновление записей в таблице с использованием слоя репозитория
+
+## Введение
+
+Это руководство иллюстрирует, как обновлять записи в таблице с использованием слоя репозитория в приложении Spring Boot с JPA (Java Persistence API).
+
+## Цель
+
+Цель этого руководства - продемонстрировать процесс обновления записей в таблице, реализовав метод в интерфейсе `StudentRepository` с использованием `EntityManager`.
+
+## Метод репозитория
+
+### StudentRepository.java
+
+```java
+package com.example.demo.repository;
+
+import com.example.demo.data.entities.Student;
+import org.springframework.stereotype.Repository;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.transaction.Transactional;
+
+@Repository
+public class StudentRepository {
+
+ @PersistenceContext
+ private EntityManager entityManager;
+
+ public Student updateStudent(Student student) {
+ return entityManager.merge(student);
+ }
+}
+```
+
+### Объяснение
+
+- `@Repository`: Эта аннотация помечает класс как компонент репозитория в слое доступа к данным.
+
+- `@PersistenceContext`: Эта аннотация используется для внедрения экземпляра EntityManager в класс репозитория.
+
+- `entityManager.merge(student)`: Этот код обновляет сущность `Student` в базе данных.
+
+---
+
+# [Далее: Удаление записи](delete.md)
diff --git a/docs/ru/springsecurity/lab-work.md b/docs/ru/springsecurity/lab-work.md
new file mode 100644
index 0000000..2166b50
--- /dev/null
+++ b/docs/ru/springsecurity/lab-work.md
@@ -0,0 +1,62 @@
+[English](../../en/springsecurity/lab-work.md) | [中文](../../cn/springsecurity/lab-work.md) | Русский
+
+# Лабораторные работы по Spring Security
+
+Добро пожаловать в лабораторные работы по Spring Security! Цель этой серии задач - помочь вам на практике познакомиться с Spring Security, а также создать почти полноценный проект. Если вы начинающий или просто стремитесь улучшить свои навыки, эти практические задачи помогут вам разобраться в различных аспектах интеграции безопасности в приложение на Spring.
+
+## Цель лабораторных работ
+
+Основная цель этих лабораторных работ - предоставить вам практический опыт и уверенность в использовании безопасности в среде Spring. Spring Security широко используется для аутентификации, авторизации и обеспечения безопасности вашего приложения, и через эти задачи вы получите полезные знания о конфигурации, аутентификации, авторизации и многом другом.
+
+## Задачи практики
+
+1. [Задача 1: Настройка Spring Security](practice/configure-spring-security.md)
+2. [Задача 2: Создание базовой реализации для пользователя](practice/base-implementation-user.md)
+3. [Задача 3: Шифрование пароля](practice/password-encryption.md)
+4. [Задача 4: Добавление фиктивных пользователей](practice/add-dummy-users.md)
+5. [Задача 5: Создание идентификации для пользователей](practice/create-identity-to-users.md)
+6. [Задача 6: Создание базы для авторизации на сервере](practice/setup-server-authorization.md)
+7. [Задача 7: Авторизация аутентифицированных пользователей](practice/authorize-server-authenticated.md)
+8. [Задача 8: Авторизация по ролям](practice/authorize-server-role.md)
+9. [Задача 9: Авторизация по полномочиям](practice/authorize-server-authority.md)
+10. [Задача 10: Настройка Thymeleaf Security](practice/configure-thymeleaf-security.md)
+11. [Задача 11: Авторизация аутентифицированных пользователей](practice/authorize-client-authenticated.md)
+12. [Задача 12: Авторизация по ролям](practice/authorize-client-role.md)
+13. [Задача 13: Авторизация по полномочиям](practice/authorize-client-authority.md)
+14. [Задача 14: Пользовательская форма входа](practice/custom-login-form.md)
+
+## Задачи лабораторной работы
+
+
+
+### Задача 1: Настройка Spring Security
+Инициализация Spring Security в вашем проекте.
+
+### Задача 2: Определение Ролей и Полномочий Пользователей
+Определение различных пользовательских ролей (Менеджер, Учитель, Студент) и их соответствующих полномочий.
+
+### Задача 3: Настройка Безопасности в Контроллерах
+Защита путей приложения (endpoins) с использованием контроля доступа на основе ролей.
+
+#### Детали реализации
+**Роль Менеджера**:
+- Добавление Нового Учителя (`/teachers/new`)
+- Изменение Профиля Учителя (`/teachers/{id}/edit`)
+- Изменение Профиля Студента (`/students/{id}/edit`)
+- Изменение Оценок Студента (`/students/{id}/marks/edit`)
+
+**Роль Учителя**:
+- Изменение Оценок Студента (`/students/{id}/marks/edit`)
+- Добавление Нового Предмета (`/subjects/new`)
+- Добавление Нового Теста (`/tests/new`)
+
+**Роль Студента**:
+- Прохождение Теста (`/tests/{id}/take`)
+- Просмотр Оценок (`/students/{id}/marks`)
+
+### Задача 4: Реализация Авторизации в Шаблонах Thymeleaf
+
+Ограничение доступа к элементам пользовательского интерфейса на основе ролей пользователей.
+
+### Задача 5: Тестирование Контроля Доступа на Основе Ролей
+Убедитесь, что enpoints и элементы пользовательского интерфейса правильно защищены.
diff --git a/docs/ru/springsecurity/practice/add-dummy-users.md b/docs/ru/springsecurity/practice/add-dummy-users.md
new file mode 100644
index 0000000..d439254
--- /dev/null
+++ b/docs/ru/springsecurity/practice/add-dummy-users.md
@@ -0,0 +1,68 @@
+# Добавление фиктивных пользователей
+
+В этом задании описан процесс обновления класса `CustomUserDetailsService` для включения метода добавления фиктивных пользователей в хранилище в памяти, чтобы использовать его в качестве простого демонстрационного примера создания пользователей.
+
+## Цель
+
+Обновить класс `CustomUserDetailsService`, чтобы включить метод добавления фиктивных пользователей, позволяющий инициализировать данные пользователей в хранилище в памяти.
+
+## Шаги
+
+1. **Обновление класса CustomUserDetailsService:**
+
+ Сначала нам нужно обновить класс `CustomUserDetailsService`, чтобы добавить метод добавления фиктивных пользователей. Мы будем использовать этот метод во время инициализации бина для заполнения хранилища в памяти данными о фиктивных пользователях.
+
+ ```java
+ @Service
+ public class CustomUserDetailsService implements UserDetailsService {
+
+ private final UsersRepository usersRepository;
+ private final PasswordEncoder passwordEncoder;
+
+ @Autowired
+ public CustomUserDetailsService(UsersRepository usersRepository, PasswordEncoder passwordEncoder) {
+ this.usersRepository = usersRepository;
+ this.passwordEncoder = passwordEncoder;
+
+ // Вызываем метод addDummyUsers для добавления фиктивных пользователей во время инициализации бина
+ addDummyUsers();
+ }
+
+ @Override
+ public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
+ // Получаем данные пользователя из репозитория
+ CustomUserDetails userDetails = usersRepository.findByUsername(username);
+ if (userDetails == null) {
+ throw new UsernameNotFoundException("Пользователь с именем пользователя не найден: " + username);
+ }
+ return userDetails;
+ }
+
+ // Метод для добавления фиктивных пользователей
+ private void addDummyUsers() {
+ // Создаем фиктивных пользователей
+ CustomUserDetails admin = new CustomUserDetails("admin", passwordEncoder.encode("admin"), true, true, true, true);
+ CustomUserDetails moderator = new CustomUserDetails("moderator", passwordEncoder.encode("moderator"), true, true, true, true);
+ CustomUserDetails user = new CustomUserDetails("user", passwordEncoder.encode("user"), true, true, true, true);
+
+ // Добавляем пользователей в репозиторий
+ usersRepository.save(admin);
+ usersRepository.save(moderator);
+ usersRepository.save(user);
+ }
+ }
+ ```
+
+ В этом обновленном классе:
+ - Мы добавили конструктор, который принимает `UsersRepository` и `PasswordEncoder` в качестве зависимостей.
+ - Во время инициализации бина конструктор вызывает метод `addDummyUsers` для заполнения хранилища в памяти фиктивными пользователями.
+ - Метод `addDummyUsers` создает фиктивных пользователей с захардкоженными именами пользователей и паролями.
+ - Наконец, фиктивные пользователи сохраняются в репозитории с помощью метода `save`.
+
+## Заключение
+
+Поздравляем! Вы успешно добавили фиктивных пользователей для имитации базы данных в вашем приложении с использованием Spring Security. Путем инициализации списка фиктивных пользователей в классе UserRepositoryImpl и заполнения его во время запуска приложения вы теперь можете аутентифицировать и авторизовывать пользователей в вашем приложении.
+
+---
+
+# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: Создание идентификации для пользователей](create-identity-to-users.md)
diff --git a/docs/ru/springsecurity/practice/authorize-client-authenticated.md b/docs/ru/springsecurity/practice/authorize-client-authenticated.md
new file mode 100644
index 0000000..2fb7c91
--- /dev/null
+++ b/docs/ru/springsecurity/practice/authorize-client-authenticated.md
@@ -0,0 +1,54 @@
+# Авторизация аутентифицированных пользователей (на клиентской стороне)
+
+Этот файл описывает процесс авторизации пользователей на основе их статуса аутентификации на клиентской стороне с использованием Thymeleaf. Путем отображения или скрытия элементов в представлении в зависимости от статуса аутентификации пользователя можно контролировать видимость определенных функциональностей или действий.
+
+## Цель
+
+Контролировать видимость элементов, связанных с добавлением и удалением студентов, в зависимости от статуса аутентификации пользователя в представлениях Thymeleaf.
+
+## Шаги
+
+1. **Обновление шаблонов Thymeleaf:**
+
+ Измените шаблоны Thymeleaf для условного отображения элементов в зависимости от статуса аутентификации пользователя.
+
+ ```html
+
+
+
+ Управление студентами
+
+
+ Управление студентами
+
+
+
+
+
+
+
+
+
+
Добро пожаловать в систему управления студентами. Здесь вы можете управлять записями студентов.
+
+
+
+ ```
+
+ В этом шаблоне:
+ - Используется выражение `th:if="${#authorization.expression('isAuthenticated()')}"`, чтобы условно отображать кнопки "Добавить студента" и "Удалить студента" только если пользователь аутентифицирован.
+
+## Объяснение
+
+- **Диалект безопасности Thymeleaf**: Объект `#authorization` является частью диалекта безопасности Thymeleaf, который интегрирует Spring Security с Thymeleaf.
+- **Условное отображение**: Атрибут `th:if` используется для условного отображения или скрытия элементов в зависимости от статуса аутентификации пользователя.
+
+Следуя этим шагам, вы можете контролировать видимость элементов в ваших представлениях Thymeleaf в зависимости от статуса аутентификации пользователя, обеспечивая, что только аутентифицированные пользователи могут видеть и взаимодействовать с определенными функциональностями.
+
+---
+
+# [СЛЕДУЮЩАЯ ЗАДАЧА: Авторизация по ролям](authorize-client-role.md)
\ No newline at end of file
diff --git a/docs/ru/springsecurity/practice/authorize-client-authority.md b/docs/ru/springsecurity/practice/authorize-client-authority.md
new file mode 100644
index 0000000..f4a6842
--- /dev/null
+++ b/docs/ru/springsecurity/practice/authorize-client-authority.md
@@ -0,0 +1,55 @@
+# Авторизация по авторитету (клиентская сторона)
+
+Это задание описывает процесс авторизации пользователей на клиентской стороне веб-интерфейса с использованием Thymeleaf. Путем отображения или скрытия элементов на основе авторитетов пользователя вы можете контролировать видимость определенных функций или действий.
+
+## Цель
+
+Контроль видимости элементов, связанных с добавлением и удалением студентов, в зависимости от авторитетов пользователя в представлениях Thymeleaf.
+
+## Шаги
+
+1. **Обновление шаблонов Thymeleaf:**
+
+ Измените шаблоны Thymeleaf, чтобы условно отображать элементы в зависимости от авторитетов пользователя.
+
+ ```html
+
+
+
+ Управление студентами
+
+
+ Управление студентами
+
+
+
+
+
+
+
+
+
+
Добро пожаловать в систему управления студентами. Здесь вы можете управлять записями студентов.
+
+
+
+ ```
+
+ В этом шаблоне:
+ - Используется оператор `th:if="${#authorization.expression('hasAuthority(''WRITE'')')}"`, чтобы условно отображать кнопку "Добавить студента" только в том случае, если у пользователя есть авторитет `WRITE`.
+ - Аналогично, оператор `th:if="${#authorization.expression('hasAuthority(''DELETE'')')}"` используется для условного отображения кнопки "Удалить студента" только в том случае, если у пользователя есть авторитет `DELETE`.
+
+## Объяснение
+
+- **Диалект безопасности Thymeleaf**: Объект `#authorization` является частью диалекта безопасности Thymeleaf, который интегрирует Spring Security с Thymeleaf.
+- **Условное отображение**: Атрибут `th:if` используется для условного отображения или скрытия элементов на основе авторитетов пользователя.
+
+Следуя этим шагам, вы можете контролировать видимость элементов в ваших представлениях Thymeleaf в зависимости от авторитетов пользователей, гарантируя, что только авторизованные пользователи могут видеть и взаимодействовать с определенными функциями.
+
+---
+
+# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: Пользовательская форма входа](custom-login-form.md)
\ No newline at end of file
diff --git a/docs/ru/springsecurity/practice/authorize-client-role.md b/docs/ru/springsecurity/practice/authorize-client-role.md
new file mode 100644
index 0000000..ca031bb
--- /dev/null
+++ b/docs/ru/springsecurity/practice/authorize-client-role.md
@@ -0,0 +1,55 @@
+# Авторизация по ролям (клиентская сторона)
+
+Это задание описывает процесс авторизации пользователей на клиентской стороне веб-интерфейса с использованием Thymeleaf. Путем отображения или скрытия элементов на основе ролей пользователя можно контролировать видимость определенных функций или действий.
+
+## Цель
+
+Контроль видимости элементов, связанных с добавлением и удалением студентов, в зависимости от ролей пользователя в представлениях Thymeleaf.
+
+## Шаги
+
+1. **Обновление шаблонов Thymeleaf:**
+
+ Измените шаблоны Thymeleaf, чтобы условно отображать элементы в зависимости от ролей пользователя.
+
+ ```html
+
+
+
+ Управление студентами
+
+
+ Управление студентами
+
+
+
+
+
+
+
+
+
+
Добро пожаловать в систему управления студентами. Здесь вы можете управлять записями студентов.
+
+
+
+ ```
+
+ В этом шаблоне:
+ - Используется оператор `th:if="${#authorization.expression('hasRole(''ROLE_ADMIN'')')}"`, чтобы условно отображать кнопку "Добавить студента" только в том случае, если у пользователя есть роль `ROLE_ADMIN`.
+ - Аналогично, оператор `th:if="${#authorization.expression('hasRole(''ROLE_MANAGER'')')}"` используется для условного отображения кнопки "Удалить студента" только в том случае, если у пользователя есть роль `ROLE_MANAGER`.
+
+## Объяснение
+
+- **Диалект безопасности Thymeleaf**: Объект `#authorization` является частью диалекта безопасности Thymeleaf, который интегрирует Spring Security с Thymeleaf.
+- **Условное отображение**: Атрибут `th:if` используется для условного отображения или скрытия элементов на основе ролей пользователя.
+
+Следуя этим шагам, вы можете контролировать видимость элементов в ваших представлениях Thymeleaf в зависимости от ролей пользователей, гарантируя, что только авторизованные пользователи могут видеть и взаимодействовать с определенными функциями.
+
+---
+
+# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: Авторизация по авторитету](authorize-client-authority.md)
\ No newline at end of file
diff --git a/docs/ru/springsecurity/practice/authorize-server-authenticated.md b/docs/ru/springsecurity/practice/authorize-server-authenticated.md
new file mode 100644
index 0000000..61c8b67
--- /dev/null
+++ b/docs/ru/springsecurity/practice/authorize-server-authenticated.md
@@ -0,0 +1,38 @@
+# Авторизация аутентифицированного пользователя
+
+Это задание описывает процесс авторизации аутентифицированных пользователей в вашем приложении. Путем требования аутентификации для определенных путей или конечных точек вы можете гарантировать, что только вошедшие в систему пользователи могут получить доступ к определенным ресурсам.
+
+## Цель
+
+Авторизовать доступ к пути `/second` только для аутентифицированных пользователей, разрешив публичный доступ к другим путям.
+
+## Шаги
+
+1. **Обновление конфигурации безопасности:**
+
+ В классе `WebSecurityConfig` измените метод `configure(HttpSecurity http)` так, чтобы доступ к пути `/second` был ограничен только для аутентифицированных пользователей.
+
+ ```java
+ @Configuration
+ @EnableWebSecurity
+ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
+
+ @Override
+ protected void configure(HttpSecurity http) throws Exception {
+ http
+ .authorizeHttpRequests((requests) -> requests
+ // Другие конечные точки...
+ .requestMatchers("/second").authenticated()
+ // Другие конечные точки...
+ );
+ }
+ }
+ ```
+
+ В этой конфигурации:
+ - Мы используем `.authorizeHttpRequests()`, чтобы определить правила авторизации.
+ - Заявление `.requestMatchers("/second").authenticated()` указывает, что доступ к пути `/second` должен быть ограничен только для аутентифицированных пользователей.
+
+---
+
+# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: Авторизация по роли](authorize-server-role.md)
diff --git a/docs/ru/springsecurity/practice/authorize-server-authority.md b/docs/ru/springsecurity/practice/authorize-server-authority.md
new file mode 100644
index 0000000..2040e86
--- /dev/null
+++ b/docs/ru/springsecurity/practice/authorize-server-authority.md
@@ -0,0 +1,39 @@
+# Авторизация по правам
+
+В этом задании описывается процесс авторизации пользователей на основе их прав в вашем приложении. Присваивая различные права пользователям, вы можете контролировать доступ к определенным функциональностям или действиям.
+
+## Цель
+
+Авторизовать доступ к пути `/addStudent` для пользователей с правами `WRITE` и к пути `/removeStudent` для пользователей с правами `DELETE`.
+
+## Шаги
+
+1. **Обновление конфигурации безопасности:**
+
+ В классе `WebSecurityConfig` измените метод `configure(HttpSecurity http)` для определения контроля доступа на основе прав для путей `/addStudent` и `/removeStudent`.
+
+ ```java
+ @Configuration
+ @EnableWebSecurity
+ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
+
+ @Override
+ protected void configure(HttpSecurity http) throws Exception {
+ http
+ .authorizeHttpRequests((requests) -> requests
+ // Другие конечные точки...
+ .requestMatchers("/addStudent").hasAuthority("WRITE")
+ .requestMatchers("/removeStudent").hasAuthority("DELETE")
+ // Другие конечные точки...
+ );
+ }
+ }
+ ```
+
+ В этой конфигурации:
+ - Заявление `.requestMatchers("/addStudent").hasAuthority("WRITE")` указывает, что доступ к пути `/addStudent` должен быть ограничен для пользователей с правами `WRITE`.
+ - Аналогично, `.requestMatchers("/removeStudent").hasAuthority("DELETE")` ограничивает доступ к пути `/removeStudent` для пользователей с правами `DELETE`.
+
+---
+
+# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: Настройка безопасности Thymeleaf](configure-thymeleaf-security.md)
diff --git a/docs/ru/springsecurity/practice/authorize-server-role.md b/docs/ru/springsecurity/practice/authorize-server-role.md
new file mode 100644
index 0000000..ce374bc
--- /dev/null
+++ b/docs/ru/springsecurity/practice/authorize-server-role.md
@@ -0,0 +1,39 @@
+# Авторизация по ролям
+
+Это задание описывает процесс авторизации пользователей на основе их ролей в вашем приложении. Присваивая различные роли пользователям, вы можете контролировать доступ к определенным ресурсам или функциональностям.
+
+## Цель
+
+Авторизовать доступ к пути `/third` для пользователей с ролью `ROLE_MODERATOR` и к пути `/fourth` для пользователей с ролью `ROLE_ADMIN`.
+
+## Шаги
+
+1. **Обновление конфигурации безопасности:**
+
+ В классе `WebSecurityConfig` измените метод `configure(HttpSecurity http)` для определения контроля доступа на основе ролей для путей `/third` и `/fourth`.
+
+ ```java
+ @Configuration
+ @EnableWebSecurity
+ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
+
+ @Override
+ protected void configure(HttpSecurity http) throws Exception {
+ http
+ .authorizeHttpRequests((requests) -> requests
+ // Другие конечные точки...
+ .requestMatchers("/third").hasAuthority("ROLE_MODERATOR")
+ .requestMatchers("/fourth").hasAuthority("ROLE_ADMIN")
+ // Другие конечные точки...
+ );
+ }
+ }
+ ```
+
+ В этой конфигурации:
+ - Заявление `.requestMatchers("/third").hasAuthority("ROLE_MODERATOR")` указывает, что доступ к пути `/third` должен быть ограничен для пользователей с авторитетом `ROLE_MODERATOR`.
+ - Аналогично, `.requestMatchers("/fourth").hasAuthority("ROLE_ADMIN")` ограничивает доступ к пути `/fourth` для пользователей с авторитетом `ROLE_ADMIN`.
+
+---
+
+# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: Авторизация по полномочию](authorize-server-authority.md)
\ No newline at end of file
diff --git a/docs/ru/springsecurity/practice/base-implementation-user.md b/docs/ru/springsecurity/practice/base-implementation-user.md
new file mode 100644
index 0000000..694a173
--- /dev/null
+++ b/docs/ru/springsecurity/practice/base-implementation-user.md
@@ -0,0 +1,186 @@
+# Создание базовой реализации для управления пользователями
+
+В этом задании мы сосредоточимся на создании базовой реализации для управления пользователями в вашем приложении. Это включает в себя определение сущности UserDetails, создание репозитория для управления данными пользователей и реализацию UserDetailsService для загрузки деталей пользователей во время аутентификации.
+
+## Цель
+
+Цель этого задания - установить надежное основание для управления пользователями в вашем приложении. Реализовав UserDetails, UsersRepository и UserDetailsService, вы сможете аутентифицировать пользователей, управлять их данными и эффективно выполнять операции, связанные с пользователями.
+
+## Шаги
+
+1. **Определение сущности UserDetails**
+
+ Начните с определения сущности UserDetails, которая представляет детали пользователя в вашем приложении. Эта сущность должна реализовывать интерфейс UserDetails, предоставляемый Spring Security.
+
+ ```java
+ package edu.labs.yourproject.model;
+
+ import org.springframework.security.core.GrantedAuthority;
+ import org.springframework.security.core.userdetails.UserDetails;
+
+ import java.util.Collection;
+
+ public class CustomUserDetails implements UserDetails {
+
+ // Реализуйте методы UserDetails здесь
+
+ }
+ ```
+
+ Реализуйте методы, необходимые интерфейсом UserDetails, для предоставления деталей пользователя, таких как имя пользователя, пароль, права доступа и т. д.
+
+2. **Создание класса UsersRepository**
+
+ Поскольку мы используем хранилище в памяти на данный момент, создадим простой класс UsersRepository для управления данными пользователей.
+
+ a. **Создание класса UsersRepository**
+
+ Создайте новый класс Java с именем `UsersRepository` внутри пакета `edu.labs.yourproject.repository`.
+
+ ```java
+ package edu.labs.yourproject.repository;
+
+ import org.springframework.stereotype.Repository;
+ import edu.labs.yourproject.model.CustomUserDetails;
+
+ @Repository
+ public class UsersRepository {
+
+ private List users = new ArrayList<>();
+
+ // Добавьте методы для управления пользователями по мере необходимости
+ }
+ ```
+
+ Этот класс будет служить репозиторием для управления данными пользователей. Мы добавим методы для извлечения, добавления, обновления и удаления пользователей в последующих шагах.
+
+ b. **Добавление метода findByUsername**
+
+ Добавьте метод с именем `findByUsername` в класс `UsersRepository`. Этот метод будет извлекать детали пользователя по имени пользователя из репозитория.
+
+ ```java
+ public CustomUserDetails findByUsername(String username) {
+ for (CustomUserDetails user : users) {
+ if (user.getUsername().equals(username)) {
+ return user;
+ }
+ }
+ return null; // Пользователь не найден
+ }
+ ```
+
+ Метод `findByUsername` используется для извлечения деталей пользователя по имени пользователя из репозитория. В этой заполнительной реализации он возвращает `null`, но вы замените его фактической логикой извлечения деталей пользователя из базы данных или любого другого источника данных.
+
+3. **Реализация UserDetailsService**
+
+ На этом шаге мы реализуем UserDetailsService для загрузки деталей пользователя во время аутентификации. Этот сервис будет извлекать информацию о пользователе из UsersRepository.
+
+ a. **Создание класса CustomUserDetailsService**
+
+ Начните с создания нового класса с именем `CustomUserDetailsService` в пакете сервиса вашего проекта. Этот класс будет реализовывать интерфейс UserDetailsService, предоставляемый Spring Security.
+
+ ```java
+ package edu.labs.yourproject.service;
+
+ import org.springframework.beans.factory.annotation.Autowired;
+ import org.springframework.security.core.userdetails.UserDetails;
+ import org.springframework.security.core.userdetails.UserDetailsService;
+ import org.springframework.security.core.userdetails.UsernameNotFoundException;
+ import org.springframework.stereotype.Service;
+ import com.yourcompany.yourproject.model.CustomUserDetails;
+ import com.yourcompany.yourproject.repository.UsersRepository;
+
+ @Service
+ public class CustomUserDetailsService implements UserDetailsService {
+
+ private final UsersRepository usersRepository;
+
+ @Autowired
+ public CustomUserDetailsService(UsersRepository usersRepository) {
+ this.usersRepository = usersRepository;
+ }
+
+ // Здесь реализуются методы
+ }
+ ```
+
+ Мы создаем класс `CustomUserDetailsService` и проводим инъекцию зависимости `UsersRepository` с помощ
+
+ью конструктора.
+
+ b. **Переопределение метода loadUserByUsername**
+
+ Переопределите метод `loadUserByUsername`, определенный в интерфейсе UserDetailsService. Этот метод будет извлекать детали пользователя из UsersRepository на основе предоставленного имени пользователя.
+
+ ```java
+ @Override
+ public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
+ // Извлечение деталей пользователя из репозитория в памяти
+ CustomUserDetails userDetails = usersRepository.findByUsername(username);
+ if (userDetails == null) {
+ throw new UsernameNotFoundException("Пользователь с именем пользователя не найден: " + username);
+ }
+ return userDetails;
+ }
+ ```
+
+ Внутри метода `loadUserByUsername` мы вызываем метод `findByUsername` у UsersRepository для извлечения деталей пользователя по имени пользователя. Если пользователь не найден, мы генерируем исключение UsernameNotFoundException.
+
+4. **Настройка бинов в WebSecurityConfig**
+
+ Откройте класс WebSecurityConfig, расположенный в пакете конфигурации вашего проекта (`edu.labs.yourproject.config`). Внутри этого класса определите бины для CustomUserDetails и UserDetailsRepository.
+
+ ```java
+ package edu.labs.yourproject.config;
+
+ import edu.labs.yourproject.model.CustomUserDetails;
+ import edu.labs.yourproject.repository.UserDetailsRepository;
+ import org.springframework.context.annotation.Bean;
+ import org.springframework.context.annotation.Configuration;
+
+ @Configuration
+ @EnableWebSecurity
+ public class WebSecurityConfig {
+
+ // Весь остальной код здесь...
+
+ @Bean
+ public CustomUserDetailsService customUserDetailsService() {
+ // Создание и настройка бина CustomUserDetails
+ return new CustomUserDetailsService();
+ }
+
+ @Bean
+ public UserDetailsRepository userDetailsRepository() {
+ // Создание и настройка бина UserDetailsRepository
+ return new UserDetailsRepository();
+ }
+ }
+ ```
+
+ Определите два метода бина: `CustomUserDetailsService()` и `userDetailsRepository()`. Эти методы создают и настраивают бины CustomUserDetailsService и UserDetailsRepository соответственно.
+
+## Структура папок
+
+Структура папок вашего проекта должна выглядеть примерно так:
+
+```
+src
+└── main
+ └── java
+ └── edu
+ └── labs
+ └── yourproject
+ ├── model
+ │ └── CustomUserDetails.java
+ ├── repository
+ │ └── UsersRepository.java
+ └── service
+ └── CustomUserDetailsService.java
+```
+
+Эта структура папок показывает, где создать класс `CustomUserDetailsService` и интерфейс `UsersRepository` в вашем проекте. Организация ваших классов таким образом помогает поддерживать чистый и структурированный код.
+
+---
+
+# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: Шифрование паролей](password-encryption.md)
\ No newline at end of file
diff --git a/docs/ru/springsecurity/practice/configure-spring-security.md b/docs/ru/springsecurity/practice/configure-spring-security.md
new file mode 100644
index 0000000..4ef55f5
--- /dev/null
+++ b/docs/ru/springsecurity/practice/configure-spring-security.md
@@ -0,0 +1,79 @@
+# Настройка Spring Security
+
+В этом задании мы сосредоточимся на настройке Spring Security в вашем проекте. Spring Security предоставляет обширные средства безопасности для Java-приложений, включая аутентификацию, авторизацию и защиту от распространенных угроз безопасности.
+
+## Цель
+
+Цель этого задания - интегрировать Spring Security в ваш существующий проект, гарантируя, что ваше приложение защищено от несанкционированного доступа.
+
+## Шаги
+
+1. **Добавление зависимости Spring Security**
+
+ - Для проектов Maven:
+
+ Добавьте следующую зависимость в файл `pom.xml` вашего проекта:
+
+ ```xml
+
+ org.springframework.boot
+ spring-boot-starter-security
+
+ ```
+
+ - Для проектов Gradle:
+
+ Добавьте следующую зависимость в файл `build.gradle` вашего проекта:
+
+ ```groovy
+ implementation 'org.springframework.boot:spring-boot-starter-security'
+ ```
+
+ Убедитесь, что вы используете соответствующую версию Spring Security для вашего проекта.
+
+2. **Создание класса конфигурации безопасности**
+
+ Создайте новый Java класс с именем `WebSecurityConfig` в структуре вашего проекта. Обычно этот класс располагается в пакете `config`. Файл должен называться `WebSecurityConfig.java`.
+
+ Структура папок вашего проекта должна выглядеть примерно так:
+
+ ```
+ src
+ └── main
+ └── java
+ └── edu
+ └── labs
+ └── yourproject
+ ├── config
+ │ └── WebMvcConfig.java
+ │ └── WebSecurityConfig.java
+ └── controller
+ └── PracticeController.java
+ ```
+
+3. **Настройка класса конфигурации безопасности**
+
+ Внутри класса `WebSecurityConfig` отметьте его аннотациями `@Configuration` и `@EnableWebSecurity`, чтобы указать, что это класс конфигурации для Spring Security.
+
+ ```java
+ package edu.labs.yourproject.config;
+
+ import org.springframework.context.annotation.Configuration;
+ import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+ import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+
+ @Configuration
+ @EnableWebSecurity
+ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
+
+ @Override
+ protected void configure(HttpSecurity http) throws Exception {
+ http
+ // Конфигурация безопасности здесь
+ }
+ }
+ ```
+
+---
+
+# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: Шифрование паролей](password-encryption.md)
diff --git a/docs/ru/springsecurity/practice/configure-thymeleaf-security.md b/docs/ru/springsecurity/practice/configure-thymeleaf-security.md
new file mode 100644
index 0000000..0e0cc51
--- /dev/null
+++ b/docs/ru/springsecurity/practice/configure-thymeleaf-security.md
@@ -0,0 +1,30 @@
+# Настройка Thymeleaf с Spring Security
+
+## Цель
+Цель этого задания - интегрировать Thymeleaf с Spring Security, обеспечивая использование дополнительных диалектов и утилит, предоставляемых библиотекой `thymeleaf-extras-springsecurity6`.
+
+## Шаги
+
+1. **Gradle (Groovy):**
+
+ Добавьте зависимость `thymeleaf-extras-springsecurity6` в ваш файл `build.gradle`:
+
+ ```groovy
+ implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6:3.0.4.RELEASE'
+ ```
+
+2. **Maven:**
+
+ Добавьте следующую зависимость в ваш файл `pom.xml`:
+
+ ```xml
+
+ org.thymeleaf.extras
+ thymeleaf-extras-springsecurity6
+ 3.0.4.RELEASE
+
+ ```
+
+---
+
+# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: Создать базовую реализацию для пользователя](base-implementation-user.md)
diff --git a/docs/ru/springsecurity/practice/create-identity-to-users.md b/docs/ru/springsecurity/practice/create-identity-to-users.md
new file mode 100644
index 0000000..fc0880a
--- /dev/null
+++ b/docs/ru/springsecurity/practice/create-identity-to-users.md
@@ -0,0 +1,61 @@
+# Создание идентификации пользователей
+
+Это задание описывает процесс добавления ролей и полномочий пользователям, созданным на предыдущем этапе, "Добавление фиктивных пользователей". Присваивая роли и полномочия пользователям, мы устанавливаем их идентификацию в приложении и контролируем доступ к различным ресурсам и функционалу.
+
+## Цель
+
+Расширить профили пользователей, созданные на предыдущем этапе, присвоив им роли и полномочия, тем самым определив их идентификацию и разрешения на доступ в приложении.
+
+## Шаги
+
+1. **Обновление профилей пользователей с ролями и полномочиями:**
+
+ Мы обновим фиктивные профили пользователей, созданные в классе `CustomUserDetailsService`, чтобы добавить роли и полномочия. Это включает в себя назначение конкретных ролей каждому пользователю, таких как `ADMIN`, `MODERATOR` или `USER`, и предоставление соответствующих полномочий на основе их ролей.
+
+ ```java
+ // Внутри метода addDummyUsers()
+
+ // Определение ролей
+ String adminRole = "ROLE_ADMIN";
+ String moderatorRole = "ROLE_MODERATOR";
+ String userRole = "ROLE_USER";
+
+ // Определение полномочий
+ List adminAuthorities = Arrays.asList(
+ new SimpleGrantedAuthority(adminRole),
+ new SimpleGrantedAuthority("READ"),
+ new SimpleGrantedAuthority("WRITE")
+ );
+
+ List moderatorAuthorities = Arrays.asList(
+ new SimpleGrantedAuthority(moderatorRole),
+ new SimpleGrantedAuthority("READ")
+ );
+
+ List userAuthorities = Collections.singletonList(
+ new SimpleGrantedAuthority(userRole)
+ );
+
+ // Создание фиктивных пользователей с ролями и полномочиями
+ CustomUserDetails admin = new CustomUserDetails("admin", passwordEncoder.encode("admin"), true, true, true, true);
+ admin.setAuthorities(adminAuthorities);
+ admin.setRole(adminRole);
+
+ CustomUserDetails moderator = new CustomUserDetails("moderator", passwordEncoder.encode("moderator"), true, true, true, true);
+ moderator.setAuthorities(moderatorAuthorities);
+ moderator.setRole(moderatorRole);
+
+ CustomUserDetails user = new CustomUserDetails("user", passwordEncoder.encode("user"), true, true, true, true);
+ user.setAuthorities(userAuthorities);
+ user.setRole(userRole);
+ ```
+
+ В этом обновленном коде:
+ - Мы определяем роли и полномочия в виде переменных для ясности и удобства обслуживания.
+ - Теперь каждый профиль пользователя включает список полномочий на основе назначенных им ролей.
+ - Полномочия представлены объектами `SimpleGrantedAuthority` и добавляются в профили пользователей соответственно.
+ - Кроме того, мы устанавливаем роль для каждого пользователя, чтобы в дальнейшем использовать контроль доступа на основе ролей.
+
+---
+
+# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: Создать базу для авторизации на сервере](setup-server-authorization.md)
diff --git a/docs/ru/springsecurity/practice/custom-login-form.md b/docs/ru/springsecurity/practice/custom-login-form.md
new file mode 100644
index 0000000..e7e6d64
--- /dev/null
+++ b/docs/ru/springsecurity/practice/custom-login-form.md
@@ -0,0 +1,40 @@
+# Пользовательский формуляр входа
+
+Это задание руководит вас через процесс активации пользовательской страницы формы входа для аутентификации с использованием Spring Security. Реализуя пользовательскую страницу входа, пользователи могут безопасно аутентифицироваться в вашем приложении.
+
+## Цель
+
+Активировать пользовательскую страницу формы входа, которая уже была создана по определенному пути.
+
+## Шаги
+
+1. **Обновить конфигурацию безопасности:**
+
+ В классе `WebSecurityConfig` измените метод `configure(HttpSecurity http)` для указания пользовательской страницы входа.
+
+ ```java
+ @Configuration
+ @EnableWebSecurity
+ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
+
+ @Override
+ protected void configure(HttpSecurity http) throws Exception {
+ http
+ .authorizeHttpRequests((requests) -> requests
+ // Добавьте другие конфигурации авторизации здесь
+ )
+ .formLogin((login) -> login
+ .loginPage("/custom-login-page") // Укажите URL пользовательской страницы входа
+ // Добавьте другие конфигурации формы входа здесь
+ );
+ }
+ }
+ ```
+
+ В этой конфигурации:
+ - Оператор `.loginPage("/custom-login-page")` указывает URL пользовательской страницы входа.
+ - Вы можете добавить дополнительные конфигурации для настройки поведения формы входа, такие как установка URL для успешного или неудачного входа, определение имен полей формы и т. д.
+
+---
+
+# [СЛЕДУЮЩЕЕ: ЗАДАНИЯ](../lab-work.md)
\ No newline at end of file
diff --git a/docs/ru/springsecurity/practice/password-encryption.md b/docs/ru/springsecurity/practice/password-encryption.md
new file mode 100644
index 0000000..97a78d4
--- /dev/null
+++ b/docs/ru/springsecurity/practice/password-encryption.md
@@ -0,0 +1,82 @@
+# Шифрование паролей
+
+В этой задаче мы настроим шифрование паролей для аутентификации пользователей в приложении, использующем Spring Security. Шифрование паролей повышает безопасность, сохраняя их в базе данных в зашифрованном виде.
+
+## Цель
+
+Цель этой настройки - настроить шифрование паролей с использованием BCryptPasswordEncoder, предоставляемого Spring Security. Это обеспечит защиту паролей путем их безопасного хеширования перед сохранением в базе данных.
+
+## Шаги
+
+1. **Добавление бина BCryptPasswordEncoder**
+
+ Откройте класс WebSecurityConfig, находящийся в пакете конфигурации вашего проекта (`edu.labs.yourproject.config`). Внутри этого класса определите бин для BCryptPasswordEncoder.
+
+ ```java
+ package edu.labs.yourproject.config;
+
+ import org.springframework.context.annotation.Bean;
+ import org.springframework.context.annotation.Configuration;
+ import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+
+ @Configuration
+ public class WebSecurityConfig {
+
+ @Bean
+ public BCryptPasswordEncoder passwordEncoder() {
+ // Создание и настройка бина BCryptPasswordEncoder
+ return new BCryptPasswordEncoder();
+ }
+ }
+ ```
+
+ Определите метод бина `passwordEncoder()`, который создает и настраивает бин BCryptPasswordEncoder. Этот бин будет использоваться для шифрования паролей перед их сохранением в базе данных.
+
+2. **Шифрование паролей**
+
+ a. **Обновление класса CustomUserDetailsService**
+
+ Откройте класс CustomUserDetailsService, находящийся в вашем пакете сервисов (`edu.labs.yourproject.service`). Внедрите бин BCryptPasswordEncoder в этот класс.
+
+ ```java
+ package edu.labs.yourproject.service;
+
+ import org.springframework.beans.factory.annotation.Autowired;
+ import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+ import org.springframework.stereotype.Service;
+ import edu.labs.yourproject.model.CustomUserDetails;
+ import edu.labs.yourproject.repository.UsersRepository;
+
+ @Service
+ public class CustomUserDetailsService implements UserDetailsService {
+
+ private final UsersRepository usersRepository;
+
+ @Autowired
+ private BCryptPasswordEncoder passwordEncoder;
+
+ @Autowired
+ public CustomUserDetailsService(UsersRepository usersRepository) {
+ this.usersRepository = usersRepository;
+ }
+ }
+ ```
+
+ b. **Реализация метода регистрации**
+
+ Определите метод в классе CustomUserDetailsService для обработки регистрации пользователя. В этом методе зашифруйте пароль пользователя перед сохранением его в базе данных.
+
+ ```java
+ public void registerUser(CustomUserDetails user) {
+ // Шифрование пароля перед сохранением пользователя
+ String encodedPassword = passwordEncoder.encode(user.getPassword());
+ user.setPassword(encodedPassword);
+ usersRepository.save(user);
+ }
+ ```
+
+ Этот метод принимает объект CustomUserDetails, представляющий пользователя для регистрации. Он шифрует пароль пользователя с использованием бина BCryptPasswordEncoder, а затем сохраняет пользователя в базе данных.
+
+---
+
+# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: Добавить тестовых пользователей](add-dummy-users.md)
diff --git a/docs/ru/springsecurity/practice/setup-server-authorization.md b/docs/ru/springsecurity/practice/setup-server-authorization.md
new file mode 100644
index 0000000..28672bc
--- /dev/null
+++ b/docs/ru/springsecurity/practice/setup-server-authorization.md
@@ -0,0 +1,45 @@
+# Настройка авторизации на сервере
+
+В этой задаче мы настроим авторизацию в вашем приложении, определив правила безопасности с использованием Spring Security. Определяя правила авторизации, вы можете контролировать доступ к определенным путям и конечным точкам в вашем приложении.
+
+## Цель
+
+Настроить правила авторизации для ограничения или разрешения доступа к различным путям и конечным точкам в приложении.
+
+## Шаги
+
+1. **Добавление конфигурации безопасности:**
+
+ В классе `WebSecurityConfig` добавьте метод `configure(HttpSecurity http)`, чтобы определить правила безопасности для приложения. Мы будем использовать пути и конечные точки, определенные в предыдущей лабораторной работе.
+
+ ```java
+ @Configuration
+ @EnableWebSecurity
+ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
+
+ @Override
+ protected void configure(HttpSecurity http) throws Exception {
+ http
+ .authorizeHttpRequests((requests) -> requests
+ .requestMatchers("/first").permitAll()
+ .requestMatchers("/second").permitAll()
+ .requestMatchers("/third").permitAll()
+ .requestMatchers("/fourth").permitAll()
+ .requestMatchers("/addStudent").permitAll()
+ .requestMatchers("/removeStudent").permitAll()
+ );
+ }
+ }
+ ```
+
+ В этой конфигурации:
+ - Мы используем `.authorizeHttpRequests()`, чтобы определить правила авторизации.
+ - Внутри лямбда-выражения мы указываем, какие запросы следует разрешить.
+
+## Вывод
+
+Вы успешно настроили правила авторизации в вашем приложении для управления доступом к различным путям и конечным точкам. Определяя конкретные разрешения для каждого пути, вы можете гарантировать, что пользователи смогут получить доступ только к ресурсам, к которым у них есть соответствующие разрешения.
+
+---
+
+# [СЛЕДУЮЩАЯ ЗАДАЧА: Авторизация аутентифицированных пользователей](authorize-server-authenticated.md)
diff --git a/docs/ru/thymeleaf/lab-work.md b/docs/ru/thymeleaf/lab-work.md
new file mode 100644
index 0000000..dd9bd8e
--- /dev/null
+++ b/docs/ru/thymeleaf/lab-work.md
@@ -0,0 +1,74 @@
+[English](../../en/thymeleaf/lab-work.md) | [中文](../../cn/thymeleaf/lab-work.md) | Русский
+
+
+# Лабораторная работа по Thymeleaf
+
+Добро пожаловать в лабораторную работу по Thymeleaf! Цель этой серии задач - помочь вам практиковаться и освоить Thymeleaf - шаблонизатор для Java-приложений. Независимо от того, являетесь ли вы начинающим или стремитесь улучшить свои навыки, эти практические задачи научат вас различным аспектам интеграции Thymeleaf в приложении Spring.
+
+## Цель лабораторной работы
+
+Цель этой лабораторной работы - помочь вам изучить Thymeleaf в среде Spring на практике. Thymeleaf широко используется для серверного рендеринга в веб-разработке. Прорешав эти задания, вы получите полезные знания о его конфигурации, использовании переменных, контроллерах, обработке форм и многом другом.
+
+## Практические задачи
+
+1. [Задача 1: Настройка Thymeleaf в Spring](practice/configure-thymeleaf.md)
+2. [Задача 2: Создание первого представления](practice/create-first-view.md)
+3. [Задача 3: Работа с переменными](practice/working-with-variables.md)
+4. [Задача 4: Переменные и контроллер](practice/variables-and-controller.md)
+5. [Задача 5: Итерация](practice/iteration.md)
+6. [Задача 6: Литералы](practice/literals.md)
+7. [Задача 7: Формы](practice/forms.md)
+8. [Задача 8: Обработка форм](practice/form-handling.md)
+9. [Задача 9: Query Parameter и валидация](practice/validation.md)
+10. [Задача 10: Фрагменты и макеты](practice/fragments-and-layouts.md)
+
+
+## Задачи лабораторной работы
+
+1. **Задача 1: Создание HTML-макета с фрагментами**
+
+ - Создайте отдельные фрагменты для различных частей HTML-страницы, таких как навигационная панель, заголовок, header и подвал.
+ - Соберите эти фрагменты в один HTML-файл, чтобы создать полноценный макет веб страницы.
+ - Например:
+
+ 
+
+2. **Задача 2: Создание домашней страницы с локализацией**
+
+ - Реализуйте домашнюю страницу, доступную по пути `/`.
+ - Используйте созданный в Задаче 1 макет для структурирования домашней страницы.
+ - Используйте выражения `#{}` для всего текстового содержимого на домашней странице, демонстрируя локализацию или сообщения из файла .properties.
+ - Например:
+
+ 
+
+3. **Задача 3: Создание форм входа и регистрации**
+
+ - Создайте формы входа и регистрации для аутентификации пользователей.
+ - Используйте привязку модели Thymeleaf для обработки данных формы.
+ - Например:
+
+ 
+
+ 
+
+4. **Задача 4: Валидация действий входа и регистрации**
+
+ - Реализуйте валидацию для действий входа и регистрации.
+ - Используйте параметры запроса для передачи сообщений об ошибках в случае неудачной валидации.
+ - Обеспечьте безопасное и правильное обращение с вводом пользователя.
+ - Например:
+
+ 
+
+5. **Задача 5: Создание страницы пользователей**
+
+ - Разработайте страницу "Пользователи", отображающую таблицу пользователей.
+ - Реализуйте итерацию для динамического заполнения таблицы данными пользователей.
+ - Реализуйте функциональность для удаления или изменения записей пользователя на странице.
+ - Например:
+
+ 
+
+ 
+
diff --git a/docs/ru/thymeleaf/practice/configure-thymeleaf.md b/docs/ru/thymeleaf/practice/configure-thymeleaf.md
new file mode 100644
index 0000000..1031ed8
--- /dev/null
+++ b/docs/ru/thymeleaf/practice/configure-thymeleaf.md
@@ -0,0 +1,115 @@
+# Настройка Thymeleaf в Spring
+
+**Описание:**
+
+Это задание включает в себя настройку Thymeleaf в приложении Spring для обеспечения легкой интеграции шаблонного движка для веб-разработки.
+
+## **Шаги:**
+
+1. **Создайте Класс Конфигурации Thymeleaf:**
+ - В вашем проекте Spring создайте новый Java-класс, аннотированный `@Configuration`. Мы рекомендуем разместить этот класс в пакете `config`.
+ - Расширьте класс с `WebMvcConfigurer`.
+
+ Пример:
+
+ ```java
+ package edu.labs.thymeleaf.config;
+
+ import org.springframework.context.annotation.Configuration;
+ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+ @Configuration
+ public class WebMvcConfig implements WebMvcConfigurer {
+ // Код конфигурации размещается здесь
+ }
+ ```
+
+ Размещение класса конфигурации в пакете `config` помогает правильно структурировать ваш код. Скорректируйте имя пэкеджа в зависимости от структуры вашего проекта.
+
+2. **Настройте Разрешитель Шаблонов Thymeleaf:**
+ - Создайте метод с аннотацией `@Bean` для конфигурации шаблонизатора Thymeleaf.
+ - Используйте `ClassLoaderTemplateResolver` и установите префикс, суффикс, режим шаблона и кодировку символов.
+
+ ```java
+ @Bean
+ public ClassLoaderTemplateResolver templateResolver() {
+ // Создайте bean ClassLoaderTemplateResolver
+ ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver();
+
+ // Установите путь, где Thymeleaf будет искать шаблоны
+ templateResolver.setPrefix("/templates/");
+
+ // Установите расширение файла для шаблонов
+ templateResolver.setSuffix(".html");
+
+ // Установите режим шаблона в HTML
+ templateResolver.setTemplateMode(TemplateMode.HTML);
+
+ // Установите кодировку символов для шаблонов
+ templateResolver.setCharacterEncoding("UTF-8");
+
+ // Верните настроенный bean разрешителя шаблонов
+ return templateResolver;
+ }
+ ```
+
+3. **Настройте Источник Сообщений:**
+ - Добавьте метод, аннотированный `@Bean`, для настройки источника сообщений с использованием `ReloadableResourceBundleMessageSource`.
+ - Установите кодировку по умолчанию.
+
+ ```java
+ @Bean
+ public MessageSource messageSource() {
+ // Создайте bean ReloadableResourceBundleMessageSource
+ ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
+
+ // Установите кодировку по умолчанию для сообщений
+ messageSource.setDefaultEncoding("UTF-8");
+
+ // Верните настроенный bean источника сообщений
+ return messageSource;
+ }
+ ```
+
+4. **Настройте Разрешитель Представлений Thymeleaf:**
+ - Создайте метод, аннотированный `@Bean`, для настройки Thymeleaf.
+ - Установите шаблонный движок.
+
+ ```java
+ @Bean
+ public ViewResolver thymeleafViewResolver() {
+ // Создайте bean ThymeleafViewResolver
+ ThymeleafViewResolver resolver = new ThymeleafViewResolver();
+
+ // Установите шаблонный движок для разрешителя представлений
+ resolver.setTemplateEngine(templateEngine());
+
+ // Верните настроенный bean ThymeleafViewResolver
+ return resolver;
+ }
+ ```
+
+5. **Настройте Шаблонный Движок Thymeleaf:**
+ - Реализуйте метод, аннотированный `@Bean`, для настройки шаблонного движка Thymeleaf.
+ - Установите разрешитель шаблонов и источник сообщений шаблонного движка.
+
+ ```java
+ @Bean
+ public SpringTemplateEngine templateEngine() {
+ // Создайте bean SpringTemplateEngine
+ SpringTemplateEngine templateEngine = new SpringTemplateEngine();
+
+ // Установите разрешитель шаблонов для шаблонного движка
+ templateEngine.setTemplateResolver(templateResolver());
+
+ // Установите источник сообщений шаблонного движка
+ templateEngine.setTemplateEngineMessageSource(messageSource());
+
+ // Верните настроенный bean SpringTemplateEngine
+ return templateEngine;
+ }
+ ```
+
+---
+
+# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Создание Первого Представления*](create-first-view.md)
diff --git a/docs/ru/thymeleaf/practice/create-first-view.md b/docs/ru/thymeleaf/practice/create-first-view.md
new file mode 100644
index 0000000..c9527d3
--- /dev/null
+++ b/docs/ru/thymeleaf/practice/create-first-view.md
@@ -0,0 +1,59 @@
+# Создание Первого Представления
+
+**Описание:**
+
+В данной задаче мы создадим первое представление Thymeleaf для вашего приложения Spring. Следуйте указанному пути к файлам, определенному в конфигурации Thymeleaf, и зарегистрируйте представление в приложении.
+
+## **Шаги:**
+
+1. **Создайте Файл Представления:**
+ - Перейдите в каталог, указанный в конфигурации Thymeleaf как префикс для шаблонов.
+ - По умолчанию префикс настроен как `/templates/`. Следовательно, создайте файл представления Thymeleaf в этом каталоге.
+
+ ```plaintext
+ Каталог Проекта
+ └── src
+ └── main
+ └── resources
+ └── templates
+ └── practice
+ └── first.html
+ ```
+
+ Убедитесь, что файл представления имеет правильное имя (например, `first.html`). Каталог `/templates/` важен для того, чтобы Thymeleaf мог правильно находить и обрабатывать ваши шаблоны.
+
+2. **Зарегистрируйте Представление в Конфигурационном Классе:**
+ - Откройте конфигурационный класс, где вы настраивали Thymeleaf (например, `WebMvcConfig`).
+ - Добавьте следующий метод для регистрации представления Thymeleaf:
+
+ ```java
+ public void addViewControllers(ViewControllerRegistry registry) {
+ // Первое представление
+ registry.addViewController("/first").setViewName("practice/first");
+ }
+ ```
+
+ Этот метод сопоставляет URL-путь `/first` с представлением Thymeleaf с именем "practice/first". Скорректируйте путь в соответствии с структурой вашего проекта.
+
+3. **Проверьте Представление:**
+ - Запустите ваше приложение Spring.
+ - Откройте веб-браузер и перейдите по адресу `http://localhost:8080/first`. Вы должны увидеть отображенное представление Thymeleaf.
+
+4. **Дополнительно: Настройте Перенаправление с Корневого Пути:**
+ - Чтобы установить первое представление в качестве страницы по умолчанию, вы можете добавить перенаправление с корневого пути ("/") на путь первого представления в методе `addViewControllers`:
+
+ ```java
+ public void addViewControllers(ViewControllerRegistry registry) {
+ // Первое представление
+ registry.addViewController("/first").setViewName("practice/first");
+
+ // Перенаправление с корневого пути на первое представление
+ registry.addRedirectViewController("/", "/first");
+ }
+ ```
+
+ Теперь при посещении `http://localhost:8080/` произойдет автоматическое перенаправление на первое представление.
+
+---
+
+# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Работа с Переменными*](working-with-variables.md)
\ No newline at end of file
diff --git a/docs/ru/thymeleaf/practice/form-handling.md b/docs/ru/thymeleaf/practice/form-handling.md
new file mode 100644
index 0000000..a9eec58
--- /dev/null
+++ b/docs/ru/thymeleaf/practice/form-handling.md
@@ -0,0 +1,72 @@
+# Обработка Формы
+
+**Описание:**
+
+В этом продолжении мы сосредоточимся на обработке отправки форм и отображении представления с использованием `PracticeController`. Это включает передачу модели в представление при его отображении и реализацию логики обработки отправки формы.
+
+**Шаги:**
+
+1. **Отображение Представления Формы (PracticeController):**
+
+ - Откройте класс `PracticeController` и добавьте метод для отображения представления формы:
+
+ ```java
+ import org.springframework.stereotype.Controller;
+ import org.springframework.ui.Model;
+ import org.springframework.web.bind.annotation.GetMapping;
+
+ @Controller
+ public class PracticeController {
+
+ // Другие методы...
+
+ @GetMapping("/third")
+ public String showAddStudentForm(Model model) {
+ model.addAttribute("model", new StudentModel());
+ return "practice/third";
+ }
+ }
+ ```
+
+ - Объяснение:
+ - `@GetMapping("/third")`: Эта аннотация сопоставляет метод с обработкой GET-запросов для конечной точки `/third`.
+ - `showAddStudentForm(Model model)`: Этот метод принимает параметр `Model`, добавляет в него новый объект `StudentModel` и возвращает имя представления (`"thirdView"` в данном случае). Обновлено для отражения правильного названия представления.
+ - Модель заполняется новым экземпляром `StudentModel`, который будет использоваться для привязки полей формы.
+
+2. **Обработка Отправки Формы (PracticeController):**
+
+ - Добавьте метод в `PracticeController` для обработки отправки формы:
+
+ ```java
+ import org.springframework.stereotype.Controller;
+ import org.springframework.ui.Model;
+ import org.springframework.web.bind.annotation.*;
+
+ import java.util.ArrayList;
+ import java.util.List;
+
+ @Controller
+ public class PracticeController {
+
+ private final List students = new ArrayList<>();
+
+ // Другие методы...
+
+ @PostMapping("/addStudent")
+ public String addStudent(@ModelAttribute("model") StudentModel model) {
+ students.add(model);
+
+ return "redirect:/third";
+ }
+ }
+ ```
+
+ - Объяснение:
+ - `@PostMapping("/addStudent")`: Эта аннотация сопоставляет метод с обработкой POST-запросов для конечной точки `/addStudent`.
+ - `addStudent(@ModelAttribute("model") StudentModel model)`: Этот метод принимает атрибут `model` из отправленной формы (`@ModelAttribute`) и обрабатывает его. Данные формы автоматически привязываются к объекту `model`.
+ - Логика внутри этого метода добавляет студента в список `students`. В реальном сценарии вы обычно бы сохраняли студента в базу данных или выполняли другие необходимые действия.
+ - `return "redirect:/third";`: Эта строка перенаправляет пользователя обратно к представлению формы (`/third`).
+
+---
+
+# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Параметры Запроса и Валидация*](validation.md)
\ No newline at end of file
diff --git a/docs/ru/thymeleaf/practice/forms.md b/docs/ru/thymeleaf/practice/forms.md
new file mode 100644
index 0000000..3ace17c
--- /dev/null
+++ b/docs/ru/thymeleaf/practice/forms.md
@@ -0,0 +1,118 @@
+# Формы
+
+**Описание:**
+
+В этом задании вы создадите новое представление Thymeleaf с именем `third.html` и реализуете логику обработки форм в контроллере `PracticeController`. Форма позволит пользователям добавлять новых студентов с определенными данными, и контроллер будет обрабатывать отправку формы.
+
+**Шаги:**
+
+1. **Создайте третье представление (third.html):**
+
+ - Создайте новый файл представления Thymeleaf с именем `third.html` в каталоге `/src/main/resources/templates/practice`.
+
+ ```html
+
+
+
+
+ Добавление студента
+
+
+
+
+
+ ```
+
+2. **Настройте отправку формы:**
+
+ - В теге `form` настройте детали отправки формы:
+
+ ```html
+