Ответ
Проект: RESTful API для управления задачами (To-Do List) на Spring Boot.
Цель: Создать backend-сервис с полным циклом аутентификации, авторизации и CRUD-операций.
Стек технологий:
- Backend: Java 17, Spring Boot 3
- Безопасность: Spring Security, JWT (JSON Web Token)
- База данных: PostgreSQL, Spring Data JPA (Hibernate)
- Документация: OpenAPI 3 (Springdoc)
- Тестирование: JUnit 5, Mockito, Testcontainers
Ключевые компоненты и реализация:
-
JWT Аутентификация и Авторизация:
- Реализован фильтр для проверки JWT-токена в каждом запросе.
@Component public class JwtAuthenticationFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { String authHeader = request.getHeader("Authorization"); if (authHeader != null && authHeader.startsWith("Bearer ")) { String jwt = authHeader.substring(7); String username = jwtUtil.extractUsername(jwt); // Утилита для работы с JWT if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) { if (jwtUtil.validateToken(jwt, username)) { // Создание объекта Authentication и установка в SecurityContext UsernamePasswordAuthenticationToken authToken = new UsernamePasswordAuthenticationToken(username, null, authorities); SecurityContextHolder.getContext().setAuthentication(authToken); } } } chain.doFilter(request, response); } }
- Реализован фильтр для проверки JWT-токена в каждом запросе.
-
Слой данных (Repository):
- Использовал Spring Data JPA для декларативного доступа к данным.
@Repository public interface TaskRepository extends JpaRepository<Task, Long> { List<Task> findByUserIdAndCompleted(Long userId, boolean completed); @Query("SELECT t FROM Task t WHERE t.dueDate < :date AND t.completed = false") List<Task> findOverdueTasks(@Param("date") LocalDate date); }
- Использовал Spring Data JPA для декларативного доступа к данным.
-
Обработка больших данных (отдельный модуль):
- Парсер CSV-файлов с использованием Java Stream API и многопоточности (
ForkJoinPool) для импорта задач.public List<Task> parseCsvFile(Path filePath) throws IOException { return Files.lines(filePath) .skip(1) // Пропуск заголовка .parallel() // Параллельная обработка строк .map(line -> line.split(",")) .filter(parts -> parts.length == 3) .map(parts -> new Task(parts[0], parts[1], LocalDate.parse(parts[2]))) .collect(Collectors.toList()); }
- Парсер CSV-файлов с использованием Java Stream API и многопоточности (
Что было реализовано:
- Регистрация и вход пользователя с выдачей JWT.
- CRUD для задач с привязкой к пользователю.
- Фильтрация и пагинация задач.
- Интеграционные и unit-тесты.
- Docker-контейнеризация приложения и БД.
Итог: Проект продемонстрировал навыки работы с ключевыми Spring-технологиями, проектированием API, безопасностью и эффективной обработкой данных.