Skip to content

[feat-1057] добавлена проверка прав в сервисах прогресса урока и программы #1078

Open
Textile86 wants to merge 1 commit intohexlet-volunteers:mainfrom
Textile86:issue-1057
Open

[feat-1057] добавлена проверка прав в сервисах прогресса урока и программы #1078
Textile86 wants to merge 1 commit intohexlet-volunteers:mainfrom
Textile86:issue-1057

Conversation

@Textile86
Copy link
Copy Markdown

@Textile86 Textile86 commented Apr 7, 2026

Closes #1057

  • Добавлена проверка прав доступа при завершении уроков и программ обучения. Теперь пользователь может завершить только свой собственный прогресс
  • Ранее любой аутентифицированный пользователь мог завершить урок или программу другого пользователя, зная ID прогресса.
  • В UserLessonProgressService.completeLesson() добавлена проверка: progress.getUser().getId().equals(userId)
  • В UserProgramProgressService.completeProgram() добавлена аналогичная проверка
  • В контроллеры передаётся user.getId() из контекста безопасности
  • Добавлено 2 теста для проверки с чужим пользователем
  • В GlobalExceptionHandler добавлена обработка AccessDeniedException с возвратом HTTP статуса 403 Forbidden

return commonHandle(errors, request, redirectAttributes, HttpStatus.UNAUTHORIZED);
}

@ExceptionHandler(AccessDeniedException.class)
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Спринг же вроде бы по дефолту преобразует AccessDeniedException в 403?


@Transactional
public void completeLesson(Long progressId) {
public void completeLesson(Long progressId, Long userId) {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Лучше не менять сигнатуру метода, а получать залогиненного пользователя внутри этого метода

.orElseThrow(() -> new ResourceNotFoundException("lesson.progress.not.found" + progressId));

if (!progress.getUser().getId().equals(userId)) {
throw new AccessDeniedException("Access denied");
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Предлагаю изменить текст ошибки, например так: "User cannot access this lesson", иначе тавтология

}

@Test
void completeLessonByAnotherUserReturnsForbidden() throws Exception {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Порефактори, плз, все тесты в этом классе так, чтобы они были изолированными друг от друга (для этого нужно не использовать методы setUp и cleanUp), а также проверь тесты на соблюдение паттерна ААА добавь комментарии
//given
//when
//then

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Backend: добавить проверку прав в сервисах прогресса обучения

2 participants