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
index e531959..dd9bd8e 100644
--- a/docs/ru/thymeleaf/lab-work.md
+++ b/docs/ru/thymeleaf/lab-work.md
@@ -1,10 +1,13 @@
+[English](../../en/thymeleaf/lab-work.md) | [中文](../../cn/thymeleaf/lab-work.md) | Русский
+
+
# Лабораторная работа по Thymeleaf
-Добро пожаловать в лабораторную работу по Thymeleaf! Цель этой серии задач - помочь вам практиковаться и освоить Thymeleaf, мощный шаблонизатор для Java-приложений. Независимо от того, являетесь ли вы начинающим или стремитесь улучшить свои навыки, эти практические задачи научат вас различным аспектам интеграции Thymeleaf в приложение Spring.
+Добро пожаловать в лабораторную работу по Thymeleaf! Цель этой серии задач - помочь вам практиковаться и освоить Thymeleaf - шаблонизатор для Java-приложений. Независимо от того, являетесь ли вы начинающим или стремитесь улучшить свои навыки, эти практические задачи научат вас различным аспектам интеграции Thymeleaf в приложении Spring.
## Цель лабораторной работы
-Основная цель этой лабораторной работы - предоставить вам практический опыт и мастерство использования Thymeleaf в среде Spring. Thymeleaf широко используется для серверного рендеринга в веб-разработке, и через эти задачи вы получите ценные знания о его конфигурации, использовании переменных, контроллерах, обработке форм и многом другом.
+Цель этой лабораторной работы - помочь вам изучить Thymeleaf в среде Spring на практике. Thymeleaf широко используется для серверного рендеринга в веб-разработке. Прорешав эти задания, вы получите полезные знания о его конфигурации, использовании переменных, контроллерах, обработке форм и многом другом.
## Практические задачи
@@ -24,8 +27,8 @@
1. **Задача 1: Создание HTML-макета с фрагментами**
- - Создайте отдельные фрагменты для различных частей HTML-страницы, таких как навигационная панель, заголовок, head и подвал.
- - Соберите эти фрагменты в один HTML-файл, чтобы создать полный макет.
+ - Создайте отдельные фрагменты для различных частей HTML-страницы, таких как навигационная панель, заголовок, header и подвал.
+ - Соберите эти фрагменты в один HTML-файл, чтобы создать полноценный макет веб страницы.
- Например:

@@ -41,13 +44,13 @@
3. **Задача 3: Создание форм входа и регистрации**
- - Разработайте и реализуйте формы входа и регистрации для аутентификации пользователей.
+ - Создайте формы входа и регистрации для аутентификации пользователей.
- Используйте привязку модели Thymeleaf для обработки данных формы.
- Например:

- 
+ 
4. **Задача 4: Валидация действий входа и регистрации**
@@ -62,13 +65,10 @@
- Разработайте страницу "Пользователи", отображающую таблицу пользователей.
- Реализуйте итерацию для динамического заполнения таблицы данными пользователей.
- - Предоставьте функциональность удаления или изменения записей пользователя со страницы.
+ - Реализуйте функциональность для удаления или изменения записей пользователя на странице.
- Например:


-Не стесняйтесь исследовать и выполнять эти задачи в своем собственном темпе. Каждая задача разработана для дополнительного развития ваших навыков в Thymeleaf и веб-разработке. Если у вас есть вопросы или вам нужна помощь, не стесняйтесь обращаться.
-
-Счастливого кодирования!
\ No newline at end of file
diff --git a/docs/ru/thymeleaf/practice/configure-thymeleaf.md b/docs/ru/thymeleaf/practice/configure-thymeleaf.md
index f767e45..1031ed8 100644
--- a/docs/ru/thymeleaf/practice/configure-thymeleaf.md
+++ b/docs/ru/thymeleaf/practice/configure-thymeleaf.md
@@ -2,7 +2,7 @@
**Описание:**
-Это задание включает в себя настройку Thymeleaf в приложении Spring для обеспечения беспроблемной интеграции шаблонного движка для веб-разработки.
+Это задание включает в себя настройку Thymeleaf в приложении Spring для обеспечения легкой интеграции шаблонного движка для веб-разработки.
## **Шаги:**
@@ -24,10 +24,10 @@
}
```
- Размещение класса конфигурации в пакете `config` повышает организованность и обеспечивает четкую структуру в вашем проекте. Скорректируйте имя пакета в зависимости от структуры вашего проекта.
+ Размещение класса конфигурации в пакете `config` помогает правильно структурировать ваш код. Скорректируйте имя пэкеджа в зависимости от структуры вашего проекта.
2. **Настройте Разрешитель Шаблонов Thymeleaf:**
- - Определите метод, аннотированный `@Bean`, для конфигурации разрешителя шаблонов Thymeleaf.
+ - Создайте метод с аннотацией `@Bean` для конфигурации шаблонизатора Thymeleaf.
- Используйте `ClassLoaderTemplateResolver` и установите префикс, суффикс, режим шаблона и кодировку символов.
```java
@@ -72,7 +72,7 @@
```
4. **Настройте Разрешитель Представлений Thymeleaf:**
- - Создайте метод, аннотированный `@Bean`, для настройки разрешителя представлений Thymeleaf.
+ - Создайте метод, аннотированный `@Bean`, для настройки Thymeleaf.
- Установите шаблонный движок.
```java
@@ -112,8 +112,4 @@
---
-**Заключение:**
-
-Поздравляю! Вы успешно настроили Thymeleaf в вашем приложении Spring. Эта настройка позволяет интегрировать шаблоны Thymeleaf без заметных усилий, предоставляя мощный инструмент для создания динамичного веб-контента. Если вы хотите более глубоко изучить конфигурацию Thymeleaf или изучить продвинутые функции, не стесняйтесь обращаться к [Документации Thymeleaf](https://www.thymeleaf.org/documentation.html).
-
-# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Создание Первого Представления*](create-first-view.md)
\ No newline at end of file
+# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Создание Первого Представления*](create-first-view.md)
diff --git a/docs/ru/thymeleaf/practice/create-first-view.md b/docs/ru/thymeleaf/practice/create-first-view.md
index a2ed7b7..c9527d3 100644
--- a/docs/ru/thymeleaf/practice/create-first-view.md
+++ b/docs/ru/thymeleaf/practice/create-first-view.md
@@ -56,8 +56,4 @@
---
-**Вывод:**
-
-Вы успешно создали и зарегистрировали ваше первое представление Thymeleaf. Убедитесь, что вы следуете правильному пути к файлам, как определено в конфигурации Thymeleaf.
-
# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Работа с Переменными*](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
index 607eba6..a9eec58 100644
--- a/docs/ru/thymeleaf/practice/form-handling.md
+++ b/docs/ru/thymeleaf/practice/form-handling.md
@@ -67,8 +67,6 @@
- Логика внутри этого метода добавляет студента в список `students`. В реальном сценарии вы обычно бы сохраняли студента в базу данных или выполняли другие необходимые действия.
- `return "redirect:/third";`: Эта строка перенаправляет пользователя обратно к представлению формы (`/third`).
-**Заключение:**
-
-Вы успешно реализовали обработку формы в Thymeleaf, включая отображение представления формы и обработку отправки формы в `PracticeController`. Пользователи могут переходить к форме, отправлять данные студента.
+---
# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Параметры Запроса и Валидация*](validation.md)
\ No newline at end of file
diff --git a/docs/ru/thymeleaf/practice/forms.md b/docs/ru/thymeleaf/practice/forms.md
index 0d185da..3ace17c 100644
--- a/docs/ru/thymeleaf/practice/forms.md
+++ b/docs/ru/thymeleaf/practice/forms.md
@@ -113,8 +113,6 @@

-**Заключение:**
-
-Вы успешно настроили форму в `third.html` и передали каждое поле в `PracticeController`, используя привязку формы Thymeleaf.
+---
# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Обработка Форм*](form-handling.md)
\ No newline at end of file
diff --git a/docs/ru/thymeleaf/practice/fragments-and-layouts.md b/docs/ru/thymeleaf/practice/fragments-and-layouts.md
index dc9f2ef..ff464c4 100644
--- a/docs/ru/thymeleaf/practice/fragments-and-layouts.md
+++ b/docs/ru/thymeleaf/practice/fragments-and-layouts.md
@@ -123,8 +123,6 @@

-**Заключение:**
-
-Вы успешно реализовали фрагменты и макеты Thymeleaf. Фрагменты теперь правильно помечены атрибутами `th:fragment` в соответствующих представлениях, что позволяет их использовать в макете `fourth.html`.
+---
# Поздравляю! Вы выполнили все задания. Теперь давайте перейдем к **[Заданиям лабораторной работы](../lab-work.md#задания-лабораторной-работы)**
diff --git a/docs/ru/thymeleaf/practice/iteration.md b/docs/ru/thymeleaf/practice/iteration.md
index 9f7803b..847c1d2 100644
--- a/docs/ru/thymeleaf/practice/iteration.md
+++ b/docs/ru/thymeleaf/practice/iteration.md
@@ -100,8 +100,6 @@

-**Заключение:**
-
-Вы успешно реализовали итерацию в Thymeleaf, создав список объектов `StudentModel`, передав его в `secondView` и отображая таблицу студентов в представлении `second.html`. Этот подход позволяет динамически отображать данные в таблицах на основе предоставленной модели.
+---
# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Литералы*](literals.md)
diff --git a/docs/ru/thymeleaf/practice/literals.md b/docs/ru/thymeleaf/practice/literals.md
index ee0af4c..b78b317 100644
--- a/docs/ru/thymeleaf/practice/literals.md
+++ b/docs/ru/thymeleaf/practice/literals.md
@@ -48,8 +48,6 @@

-**Заключение:**
-
-Вы успешно улучшили представление Thymeleaf `second.html`, внедрив литералы для изменения отображаемых значений в зависимости от определенных условий. Этот подход позволяет предоставлять более описательное и динамичное содержание в ваших представлениях.
+---
# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Формы*](forms.md)
diff --git a/docs/ru/thymeleaf/practice/validation.md b/docs/ru/thymeleaf/practice/validation.md
index 43f2e41..4ba6276 100644
--- a/docs/ru/thymeleaf/practice/validation.md
+++ b/docs/ru/thymeleaf/practice/validation.md
@@ -78,8 +78,6 @@

-**Заключение:**
-
-Вы успешно адаптировали `third` для отображения сообщений об успехе и сообщений об ошибках на основе параметров запроса. Это предоставляет более полный механизм обратной связи для пользователей, взаимодействующих с формой.
+---
# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Фрагменты и макеты*](fragments-and-layouts.md)
diff --git a/docs/ru/thymeleaf/practice/variables-and-controller.md b/docs/ru/thymeleaf/practice/variables-and-controller.md
index b4a2d9f..a8902d8 100644
--- a/docs/ru/thymeleaf/practice/variables-and-controller.md
+++ b/docs/ru/thymeleaf/practice/variables-and-controller.md
@@ -60,8 +60,6 @@
Выражение `th:text="${title}"` извлекает значение переменной `title`, переданной из контроллера.
-**Заключение:**
-
-Вы успешно создали новое представление Thymeleaf (`second.html`) и изучили процесс передачи переменных из контроллера в представление. Этот подход позволяет генерировать динамический контент на основе логики контроллера. Не стесняйтесь расширять этот концепт для передачи большего количества переменных и дополнительной настройки ваших представлений. Теперь давайте продолжим к следующему заданию
+---
# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Итерация*](iteration.md)
diff --git a/docs/ru/thymeleaf/practice/working-with-variables.md b/docs/ru/thymeleaf/practice/working-with-variables.md
index 47a0281..715422c 100644
--- a/docs/ru/thymeleaf/practice/working-with-variables.md
+++ b/docs/ru/thymeleaf/practice/working-with-variables.md
@@ -83,10 +83,6 @@

-**Заключение:**
-
-Вы успешно изучили и реализовали различные типы локальных переменных в Thymeleaf. Экспериментируйте с различными сценариями и понимайте, как эти переменные способствуют созданию динамичного и локализованного контента в вашем приложении Spring.
-
-Не стесняйтесь обращаться к [документации по Thymeleaf](https://www.thymeleaf.org/documentation.html) для получения дополнительной информации и продвинутых функций.
+---
# [СЛЕДУЮЩЕЕ ЗАДАНИЕ: *Переменные и контроллер*](variables-and-controller.md)
diff --git a/docs/ru/transactions/lab-work.md b/docs/ru/transactions/lab-work.md
new file mode 100644
index 0000000..78a97ec
--- /dev/null
+++ b/docs/ru/transactions/lab-work.md
@@ -0,0 +1,56 @@
+[English](../../en/transactions/lab-work.md) | [中文](../../cn/transactions/lab-work.md) | Русский
+
+
+# Лабораторная работа по Транзакциям
+
+Добро пожаловать в лабораторную работу по транзакциям! Цель этих задач - помочь вам овладеть управлением транзакциями в приложении на Spring. Независимо от вашего уровня - будь то начинающий или опытный разработчик, эти практические задачи помогут вам освоить различные аспекты управления транзакциями, включая распространение, уровни изоляции, вложенные транзакции и многое другое.
+
+## Цель лабораторной работы
+
+Основная цель этой лабораторной работы - предоставить вам практический опыт и навыки в управлении транзакциями. Через эти задачи вы получите ценные знания о настройке транзакций, обработке различных типов распространения, реализации вложенных транзакций и обеспечении целостности данных в ваших приложениях.
+
+## Задачи практики
+
+1. [Настройка транзакции](practice/configuration.md)
+2. [Часть 1: Создание сущностей и репозиториев](practice/lessons/entities-and-repositories.md)
+3. [Часть 2: Реализация основных транзакционных операций](practice/lessons/basic-transactional-operations.md)
+4. [Часть 3: Улучшение транзакционных методов с подробным журналированием](practice/lessons/transactional-logging.md)
+5. [Часть 4: Реализация вложенных транзакций и операций без транзакции](practice/lessons/nested-and-non-transactional-operations.md)
+
+## Задачи лабораторной работы
+
+
+
+- **Регистрация пользователя на мероприятие**
+ - **Задача:** Реализуйте метод для регистрации пользователя на мероприятие. Обеспечьте полную изоляцию операции для поддержания целостности данных. Запишите эту операцию отдельно, независимо от успешного или неудачного выполнения основной транзакции.
+ - **Распространение:** REQUIRED
+ - **Изоляция:** SERIALIZABLE
+ - **Распространение журналирования:** REQUIRES_NEW
+
+- **Удаление регистрации пользователя с мероприятия**
+ - **Задача:** Реализуйте метод для удаления регистрации пользователя с мероприятия. Обеспечьте выполнение этого метода в рамках существующей транзакции.
+ - **Распространение:** MANDATORY
+
+- **Получение зарегистрированных пользователей на мероприятие**
+ - **Задача:** Реализуйте метод для получения всех пользователей, зарегистрированных на конкретное мероприятие. Обеспечьте, чтобы метод либо присоединялся к существующей транзакции, либо создавал новую, читая только подтвержденные данные.
+ - **Распространение:** REQUIRED
+ - **Изоляция:** READ_COMMITTED
+
+- **Добавление нового мероприятия**
+ - **Задача:** Реализуйте метод для добавления нового мероприятия. Эта операция должна выполняться без транзакционных гарантий, чтобы избежать ненужных затрат на транзакции.
+ - **Распространение:** NOT_SUPPORTED
+
+- **Обновление деталей мероприятия и регистраций с вложенными транзакциями**
+ - **Задача:** Реализуйте метод для обновления деталей мероприятия вместе с соответствующими регистрациями. Обеспечьте согласованность в рамках вложенных транзакций.
+ - **Распространение:** REQUIRED
+ - **Изоляция:** REPEATABLE_READ
+ - **Вложенная задача:** Обновление регистраций в рамках вложенной транзакции.
+
+- **Обновление регистраций**
+ - **Задача:** Реализуйте метод для обновления записей регистрации. Обеспечьте, чтобы эти операции были частью вложенной транзакции.
+ - **Распространение:** NESTED
+ - **Изоляция:** REPEATABLE_READ
+
+- **Выполнение операции без транзакции**
+ - **Задача:** Реализуйте метод для операций, не требующих транзакционного контекста, например обычные операции или логгирование.
+ - **Распространение:** Нет
diff --git a/docs/ru/transactions/practice/configuration.md b/docs/ru/transactions/practice/configuration.md
new file mode 100644
index 0000000..d511378
--- /dev/null
+++ b/docs/ru/transactions/practice/configuration.md
@@ -0,0 +1,85 @@
+# Настройка транзакций
+
+## Введение
+
+Это руководство посвящено настройке управления транзакциями в проекте Spring Boot. Он предоставляет пошаговые инструкции по включению управления транзакциями и настройке атрибутов транзакций.
+
+## Цель
+
+Цель этого руководства - продемонстрировать, как настроить управление транзакциями в приложении Spring Boot, позволяя управлять транзакциями базы данных.
+
+## Настройка управления транзакциями
+
+Чтобы включить управление транзакциями в вашем проекте Spring Boot, выполните следующие шаги:
+
+1. Добавьте необходимые зависимости в ваш файл `pom.xml` или `build.gradle`. Убедитесь, что у вас есть зависимости для Spring Boot, Spring Data JPA и любого драйвера базы данных, который вы используете (например, H2, MySQL, PostgreSQL).
+
+2. Настройте управление транзакциями в вашем приложении Spring Boot. Вы можете сделать это, аннотировав ваш класс основного приложения аннотацией `@EnableTransactionManagement`.
+
+### Пример (Java Config):
+
+```java
+package com.example.demo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+@SpringBootApplication
+@EnableTransactionManagement
+public class DemoApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(DemoApplication.class, args);
+ }
+
+}
+```
+
+3. Если вы используете Spring Web MVC, вам необходимо добавить следующее в ваши файлы конфигурации для настройки менеджера транзакций:
+
+### Пример (XML Config):
+
+```xml
+
+
+
+```
+
+### Пример (Java Config):
+
+```java
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.orm.jpa.JpaTransactionManager;
+import org.springframework.transaction.PlatformTransactionManager;
+
+import javax.persistence.EntityManagerFactory;
+
+@Configuration
+public class TransactionConfig {
+
+ /**
+ * Определение бина для Spring Transaction Manager.
+ *
+ *
+ * Этот метод настраивает менеджер транзакций для JPA с использованием настроенной фабрики сущностей.
+ *
+ *
+ * @param entityManagerFactory бин фабрики сущностей
+ * @return бин TransactionManager
+ */
+ @Bean
+ public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
+ JpaTransactionManager txManager = new JpaTransactionManager();
+ txManager.setEntityManagerFactory(entityManagerFactory);
+ return txManager;
+ }
+}
+```
+
+Следуя этим шагам, вы сможете включить управление транзакциями в вашем приложении Spring Boot, что позволит вам эффективно управлять транзакциями базы данных.
+
+---
+
+# [Далее: Создание сущностей и репозиториев](lessons/entities-and-repositories.md)
\ No newline at end of file
diff --git a/docs/ru/transactions/practice/lessons/basic-transactional-operations.md b/docs/ru/transactions/practice/lessons/basic-transactional-operations.md
new file mode 100644
index 0000000..5439b83
--- /dev/null
+++ b/docs/ru/transactions/practice/lessons/basic-transactional-operations.md
@@ -0,0 +1,50 @@
+## Урок 2: Внедрение основных транзакционных операций
+
+## Цель
+
+Этот раздел направлен на введение простых, но важных транзакционных методов для зачисления студентов и управления курсами в приложении Spring Boot.
+
+## Шаги
+
+1. **Зачисление студента на курс**
+
+ **Сценарий**: В качестве администратора университета вам необходимо зачислить студента на курс. Это действие должно быть не должно вызвать проблем и гарантировать целостность данных, даже если происходит несколько зачислений одновременно или возникают проблемы с базой данных.
+
+ **Реализация метода `enrollStudentInCourse`**: Создайте метод для зачисления студента на курс. Обеспечьте, чтобы этот процесс был транзакционным, что означает, что это как единый пакетный процесс, гарантирующий, что весь процесс единый. Мы используем `Propagation.REQUIRED`, чтобы убедиться, что этот метод участвует в любой существующей транзакции или создает новую, если таковой не существует. Кроме того, мы устанавливаем `Isolation.SERIALIZABLE`, чтобы гарантировать, что даже если есть параллельные транзакции, они не мешают друг другу, сохраняя целостность данных.
+
+ ```java
+ @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.SERIALIZABLE)
+ public void enrollStudentInCourse(UUID studentId, UUID courseId) {
+ // Ваша реализация здесь
+ }
+ ```
+
+2. **Получение списка студентов для курса**
+
+ **Сценарий**: Чтобы создать список группы для курса, вам необходимо получить список студентов, которые зачислены на него. Эта операция должна гарантировать, что вы всегда получаете точные данные базы данных, даже если происходят другие действия одновременно.
+
+ **Реализация метода `getStudentsForCourse`**: Разработайте метод для извлечения студентов для определенного курса. Он должен гарантировать, что данные, которые вы извлекаете, согласованы, независимо от любых текущих транзакций. Мы используем `Propagation.REQUIRED`, чтобы убедиться, что этот метод участвует в любой существующей транзакции или создает новую, если таковая не существует. Мы устанавливаем `Isolation.READ_COMMITTED`, чтобы гарантировать, что данные, которые мы извлекаем, зафиксированы и видны другим транзакциям, поддерживая последовательность.
+
+ ```java
+ @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED)
+ public List getStudentsForCourse(UUID courseId) {
+ // Ваша реализация здесь
+ }
+ ```
+
+3. **Добавление нового курса**
+
+ **Сценарий**: Новый курс готовится к новому учебному году. При добавлении нового курса в систему вы хотите убедиться, что это действие не мешает ничему другому, происходящему в системе, сохраняя свою независимость.
+
+ **Реализация метода `addNewCourse`**: Создайте метод для добавления нового курса в систему. Убедитесь, что этот процесс не запутывается с другими текущими транзакциями. Мы используем `Propagation.NOT_SUPPORTED`, чтобы убедиться, что этот метод не участвует в какой-либо текущей транзакции, обеспечивая его автономность и избегая потенциальных конфликтов с другими операциями.
+
+ ```java
+ @Transactional(propagation = Propagation.NOT_SUPPORTED)
+ public Course addNewCourse(String title) {
+ // Ваша реализация здесь
+ }
+ ```
+
+---
+
+# [СЛЕДУЮЩЕЕ: Улучшение транзакционных методов с подробным логированием](transactional-logging.md)
diff --git a/docs/ru/transactions/practice/lessons/entities-and-repositories.md b/docs/ru/transactions/practice/lessons/entities-and-repositories.md
new file mode 100644
index 0000000..9c2e951
--- /dev/null
+++ b/docs/ru/transactions/practice/lessons/entities-and-repositories.md
@@ -0,0 +1,39 @@
+## Урок 1: Создание сущностей и репозиториев
+
+## Цель
+
+Цель этой задачи - определить основные сущности (Студент, Курс, Зачисление, Лог) и настроить соответствующие репозитории в проекте Spring Boot с использованием Spring Data JPA.
+
+## Шаги
+
+1. **Обратитесь к предоставленной ER-диаграмме, чтобы определить классы сущностей.**
+ 
+ Если у вас уже есть классы сущностей на основе предоставленной ER-диаграммы, перейдите к шагу 2. В противном случае проанализируйте ER-диаграмму и создайте следующие классы сущностей:
+
+ - Student (Студент)
+ - Course (Курс)
+ - Enrollment (Зачисление)
+ - Log (Лог)
+
+ Обеспечьте наличие необходимых атрибутов в каждом классе, как показано на ER-диаграмме.
+
+2. **Создайте репозитории для сущностей.**
+
+ Например, давайте создадим репозиторий для сущности `Student`:
+
+ ```java
+ package com.example.demo.repository;
+
+ import com.example.demo.entity.Student;
+ import org.springframework.data.jpa.repository.JpaRepository;
+
+ public interface StudentRepository extends JpaRepository {
+ }
+ ```
+
+ Если у вас уже есть репозитории, перейдите к следующему шагу. В противном случае повторите описанный выше шаг для репозиториев оставшихся сущностей (Course, Enrollment, Log).
+
+---
+
+# [СЛЕДУЮЩЕЕ: Реализация базовых транзакционных операций](basic-transactional-operations.md)
+
diff --git a/docs/ru/transactions/practice/lessons/nested-and-non-transactional-operations.md b/docs/ru/transactions/practice/lessons/nested-and-non-transactional-operations.md
new file mode 100644
index 0000000..c6473e0
--- /dev/null
+++ b/docs/ru/transactions/practice/lessons/nested-and-non-transactional-operations.md
@@ -0,0 +1,66 @@
+## Урок 4: Реализация вложенных транзакций и операций без транзакции
+
+## Цель
+
+Этот раздел направлен на изучение использования вложенных транзакций и операций без транзакции в слое сервиса, обеспечивая студентам понимание управления сложными транзакционными сценариями.
+
+## Шаги
+
+1. **Обновление деталей курса и зачислений**
+
+ **Сценарий**: В качестве администратора университета вам часто приходится обновлять как детали курса, так и зачисления, связанные с этим курсом. Эта операция должна обеспечивать целостность и непрерывность данных, даже если происходит несколько обновлений одновременно.
+
+ **Реализация метода `updateCourseAndEnrollments`**: Определите метод для обновления деталей курса и зачислений с необходимым транзакционным поведением. Мы используем `Propagation.REQUIRED`, чтобы убедиться, что этот метод участвует в любой существующей транзакции или создает новую, если таковой не существует. Установка `Isolation.REPEATABLE_READ` гарантирует, что данные, считываемые этим методом, остаются согласованными на протяжении всей транзакции. Внутри этого метода мы выполняем вложенную транзакцию, вызывая метод `updateEnrollments` для обновления зачислений, обеспечивая атомарность и изоляцию этой операции от внешней транзакции.
+
+ ```java
+ @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.REPEATABLE_READ)
+ public void updateCourseAndEnrollments(UUID courseId, String newTitle) {
+ // Запись начала процесса обновления
+ logAction("Update Course and Enrollments", "Start");
+
+ try {
+ // Реализация обновления деталей курса
+ // ...
+
+ // Вложенная транзакция для обновления зачислений
+ updateEnrollments(courseId);
+
+ // Запись успешного обновления
+ logAction("Update Course and Enrollments", "Success");
+ } catch (Exception e) {
+ // Запись неудачи
+ logAction("Update Course and Enrollments", "Failure: " + e.getMessage());
+ throw e;
+ }
+ }
+ ```
+
+2. **Независимое обновление зачислений**
+
+ **Сценарий**: Некоторые административные задачи могут потребовать обновления зачислений независимо от обновлений курса. Эта операция должна поддерживать целостность данных, позволяя при этом отдельное транзакционное управление.
+
+ **Реализация метода `updateEnrollments`**: Определите метод для обновления зачислений для курса с вложенным транзакционным поведением. Мы используем `Propagation.NESTED`, чтобы указать, что этот метод выполняется в рамках внешней транзакции, но может быть отменен независимо при необходимости. Установка `Isolation.REPEATABLE_READ` гарантирует, что данные, считываемые этим методом, остаются согласованными на протяжении всей транзакции.
+
+ ```java
+ @Transactional(propagation = Propagation.NESTED, isolation = Isolation.REPEATABLE_READ)
+ public void updateEnrollments(UUID courseId) {
+ // Запись начала процесса обновления зачислений
+ logAction("Update Enrollments", "Start");
+
+ try {
+ // Реализация обновления зачислений
+ // ...
+
+ // Запись успешного обновления
+ logAction("Update Enrollments", "Success");
+ } catch (Exception e) {
+ // Запись неудачи
+ logAction("Update Enrollments", "Failure: " + e.getMessage());
+ throw e;
+ }
+ }
+ ```
+
+---
+
+# [ДАЛЕЕ: Задания](../../lab-work.md)
diff --git a/docs/ru/transactions/practice/lessons/transactional-logging.md b/docs/ru/transactions/practice/lessons/transactional-logging.md
new file mode 100644
index 0000000..c55423b
--- /dev/null
+++ b/docs/ru/transactions/practice/lessons/transactional-logging.md
@@ -0,0 +1,105 @@
+## Урок 3: Дополнение транзакционных методов логгированием
+
+## Цель
+
+Этот раздел направлен на интеграцию логгирования для каждой транзакционной операции, обеспечивая запись действий с их результатами.
+
+## Шаги
+
+1. **Реализация метода журналирования(логгирования)**
+
+ **Сценарий**: Прежде чем улучшать транзакционные методы с помощью журналирования, нам нужно реализовать метод для обработки журналирования независимо от основной транзакции. Это гарантирует, что логгирование происходит надежно, независимо от результата основной транзакции.
+
+ **Реализация метода `logAction`**: Создайте метод для независимого записывания действий, обеспечивая точное отслеживание результатов транзакции. Мы используем `Propagation.REQUIRES_NEW`, чтобы выполнить операцию логгирования в отдельной транзакции, делая ее независимой от любых текущих транзакций и гарантируя ее завершение даже в случае сбоя основной транзакции.
+
+ ```java
+ @Transactional(propagation = Propagation.REQUIRES_NEW)
+ public void logAction(String action, String outcome) {
+ Log log = new Log(action, outcome, LocalDateTime.now());
+ logRepository.save(log);
+ }
+ ```
+
+2. **Логгирование зачисления студента на курс**
+
+ **Сценарий**: В качестве администратора университета вам необходимо зарегистрировать зачисление студента на курс для отслеживания успешных зачислений и возможных ошибок.
+
+ **Улучшение метода `enrollStudentInCourse`**: Измените метод для журналирования успешного или неудачного действия.
+
+ ```java
+ @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.SERIALIZABLE)
+ public void enrollStudentInCourse(UUID studentId, UUID courseId) {
+ // Запись начала процесса зачисления
+ logAction("Enroll Student", "Start");
+
+ try {
+ // Реализация зачисления студента на курс
+ // ...
+
+ // Журналирование успешного зачисления
+ logAction("Enroll Student", "Success");
+ } catch (Exception e) {
+ // Журналирование ошибки
+ logAction("Enroll Student", "Failure: " + e.getMessage());
+ throw e;
+ }
+ }
+ ```
+
+3. **Запись получения списка студентов для курса**
+
+ **Сценарий**: Для поддержания аудита активностей, связанных с курсом, вам необходимо зарегистрировать получение списка студентов для курса и гарантировать, что журналирование происходит даже в случае исключений.
+
+ **Улучшение метода `getStudentsForCourse`**: Измените метод для журналирования успешного или неудачного действия.
+
+ ```java
+ @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED)
+ public List getStudentsForCourse(UUID courseId) {
+ // Запись начала получения списка студентов для курса
+ logAction("Retrieve Students for Course", "Start");
+
+ try {
+ // Реализация получения списка студентов для курса
+ // ...
+
+ // Журналирование успешного получения
+ logAction("Retrieve Students for Course", "Success");
+ return students;
+ } catch (Exception e) {
+ // Журналирование ошибки
+ logAction("Retrieve Students for Course", "Failure: " + e.getMessage());
+ throw e;
+ }
+ }
+ ```
+
+4. **Запись добавления нового курса**
+
+ **Сценарий**: При добавлении нового курса важно зарегистрировать результат операции для отслеживания успешного или неудачного добавления.
+
+ **Улучшение метода `addNewCourse`**: Измените метод для журналирования успешного или неудачного действия.
+
+ ```java
+ @Transactional(propagation = Propagation.NOT_SUPPORTED)
+ public Course addNewCourse(String title) {
+ // Запись начала добавления нового курса
+ logAction("Add New Course", "Start");
+
+ try {
+ // Реализация добавления нового курса
+ // ...
+
+ // Журналирование успешного добавления
+ logAction("Add New Course", "Success");
+ return savedCourse;
+ } catch (Exception e) {
+ // Журналирование ошибки
+ logAction("Add New Course", "Failure: " + e.getMessage());
+ throw e;
+ }
+ }
+ ```
+
+---
+
+# [ДАЛЕЕ: Реализация вложенных транзакций и непривязанных к транзакции операций](nested-and-non-transactional-operations.md)
\ No newline at end of file
diff --git a/docs/srcs/jmeter/disable-element.png b/docs/srcs/jmeter/disable-element.png
new file mode 100644
index 0000000..2ecf91e
Binary files /dev/null and b/docs/srcs/jmeter/disable-element.png differ
diff --git a/docs/srcs/jmeter/interface.png b/docs/srcs/jmeter/interface.png
new file mode 100644
index 0000000..1e18560
Binary files /dev/null and b/docs/srcs/jmeter/interface.png differ
diff --git a/docs/srcs/jmeter/new-http-cookie-manager-button.png b/docs/srcs/jmeter/new-http-cookie-manager-button.png
new file mode 100644
index 0000000..efa9a6f
Binary files /dev/null and b/docs/srcs/jmeter/new-http-cookie-manager-button.png differ
diff --git a/docs/srcs/jmeter/new-recording-controller-button.png b/docs/srcs/jmeter/new-recording-controller-button.png
new file mode 100644
index 0000000..b86d960
Binary files /dev/null and b/docs/srcs/jmeter/new-recording-controller-button.png differ
diff --git a/docs/srcs/jmeter/new-regular-expression-button.png b/docs/srcs/jmeter/new-regular-expression-button.png
new file mode 100644
index 0000000..dbe8971
Binary files /dev/null and b/docs/srcs/jmeter/new-regular-expression-button.png differ
diff --git a/docs/srcs/jmeter/new-simple-controller-button.png b/docs/srcs/jmeter/new-simple-controller-button.png
new file mode 100644
index 0000000..3458971
Binary files /dev/null and b/docs/srcs/jmeter/new-simple-controller-button.png differ
diff --git a/docs/srcs/jmeter/recording-controller-button.png b/docs/srcs/jmeter/recording-controller-button.png
new file mode 100644
index 0000000..2b0faf2
Binary files /dev/null and b/docs/srcs/jmeter/recording-controller-button.png differ
diff --git a/docs/srcs/jmeter/regular-expression-extractor-fields.png b/docs/srcs/jmeter/regular-expression-extractor-fields.png
new file mode 100644
index 0000000..ffacef5
Binary files /dev/null and b/docs/srcs/jmeter/regular-expression-extractor-fields.png differ
diff --git a/docs/srcs/jmeter/run-test-scenraio-button.png b/docs/srcs/jmeter/run-test-scenraio-button.png
new file mode 100644
index 0000000..67466c7
Binary files /dev/null and b/docs/srcs/jmeter/run-test-scenraio-button.png differ
diff --git a/docs/srcs/jmeter/setting-port-and-url-pattern.png b/docs/srcs/jmeter/setting-port-and-url-pattern.png
new file mode 100644
index 0000000..a29229b
Binary files /dev/null and b/docs/srcs/jmeter/setting-port-and-url-pattern.png differ
diff --git a/docs/srcs/jmeter/site.png b/docs/srcs/jmeter/site.png
new file mode 100644
index 0000000..9c84e82
Binary files /dev/null and b/docs/srcs/jmeter/site.png differ
diff --git a/docs/srcs/jmeter/start-recording-button.png b/docs/srcs/jmeter/start-recording-button.png
new file mode 100644
index 0000000..94be557
Binary files /dev/null and b/docs/srcs/jmeter/start-recording-button.png differ
diff --git a/docs/srcs/jmeter/stop-recording-button.png b/docs/srcs/jmeter/stop-recording-button.png
new file mode 100644
index 0000000..e539997
Binary files /dev/null and b/docs/srcs/jmeter/stop-recording-button.png differ
diff --git a/docs/srcs/jmeter/test-plan.png b/docs/srcs/jmeter/test-plan.png
new file mode 100644
index 0000000..b4f1660
Binary files /dev/null and b/docs/srcs/jmeter/test-plan.png differ
diff --git a/docs/srcs/jmeter/test-script-recorder.png b/docs/srcs/jmeter/test-script-recorder.png
new file mode 100644
index 0000000..3cb9278
Binary files /dev/null and b/docs/srcs/jmeter/test-script-recorder.png differ
diff --git a/docs/srcs/jmeter/thread-group-icon.png b/docs/srcs/jmeter/thread-group-icon.png
new file mode 100644
index 0000000..9c7cd2e
Binary files /dev/null and b/docs/srcs/jmeter/thread-group-icon.png differ
diff --git a/docs/srcs/jmeter/thread-group.png b/docs/srcs/jmeter/thread-group.png
new file mode 100644
index 0000000..8769c76
Binary files /dev/null and b/docs/srcs/jmeter/thread-group.png differ
diff --git a/docs/srcs/jpa/er-diagram.png b/docs/srcs/jpa/er-diagram.png
new file mode 100644
index 0000000..3d47dc4
Binary files /dev/null and b/docs/srcs/jpa/er-diagram.png differ
diff --git a/docs/srcs/jpa/task-er-diagram.png b/docs/srcs/jpa/task-er-diagram.png
new file mode 100644
index 0000000..aa3dbcc
Binary files /dev/null and b/docs/srcs/jpa/task-er-diagram.png differ
diff --git a/docs/srcs/springsecurity/task.png b/docs/srcs/springsecurity/task.png
new file mode 100644
index 0000000..7b8e717
Binary files /dev/null and b/docs/srcs/springsecurity/task.png differ
diff --git a/docs/srcs/thymeleaf/signup.png b/docs/srcs/thymeleaf/signup.png
new file mode 100644
index 0000000..5c0c764
Binary files /dev/null and b/docs/srcs/thymeleaf/signup.png differ
diff --git a/docs/srcs/transactions/er-diagram.png b/docs/srcs/transactions/er-diagram.png
new file mode 100644
index 0000000..92809d0
Binary files /dev/null and b/docs/srcs/transactions/er-diagram.png differ
diff --git a/docs/srcs/transactions/task-chart.png b/docs/srcs/transactions/task-chart.png
new file mode 100644
index 0000000..a92af23
Binary files /dev/null and b/docs/srcs/transactions/task-chart.png differ
diff --git a/settings.gradle b/settings.gradle
index 256101f..b73e5d5 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1 +1,3 @@
rootProject.name = 'java-web-dev-tutorial'
+
+include 'a-thymeleaf'
\ No newline at end of file