fugro
@fugro
Начинающий кодер

Как разрешить пользователю редактировать только собсвенные комментарии?

Всем привет!
Я начал настраивать spring security в своем проекте на Spring Boot.
Как разрешить юзеру редактировать только свои комментарии? Аннотация
@PreAuthorize("(hasAuthority('USER') and principal.id == #userId)")
не подходит, потому что в сигнатуре метода отсутвует userId.

Как можно проверить что авторизированный юзер является автором комментария?

Код сервиса:
public CommentReadDTO patchComment(UUID articleId, UUID commentId, CommentPatchDTO patchDTO) {
        Comment comment = getCommentRequired(targetObjectId, id);

        translationService.map(patchDTO, comment);
        comment = commentRepository.save(comment);

        return translationService.translate(comment, CommentReadDTO.class);
    }
  • Вопрос задан
  • 196 просмотров
Пригласить эксперта
Ответы на вопрос 1
azerphoenix
@azerphoenix Куратор тега Java
Java Software Engineer
У меня есть несколько идей по решению данной задачи. Какая из них корректная не скажу, но тем не менее решит ваши задачи.

Итак,
Для начала создадим controllerAdvice

@RequiredArgsConstructor
@ControllerAdvice
public class GlobalControllerAdvice {
private final UserServiceImpl userServiceImpl;

@ModelAttribute("currentUser")
    public User getUserProfile(
            @AuthenticationPrincipal UserDetails currentUser
    ) {
        if (currentUser != null)
            return (User) userServiceImpl.findUserByEmail(currentUser.getUsername());
        return null;
    }

}


Теперь, нам доступна переменная ${currentUser} (текущий авторизованный пользователь)

Далее, допустим, что мы хотим на клиенте отобразить иконку редактирования по клику на которую пользователь сможет отредактировать комментарий.
Когда вы в html (в шаблонизаторе) циклом выводите список комментариев, то просто сравните текущего авторизованного пользователя и автора каждого комментария. Если equals(), то показываем иконку редактирования, а если нет, то не показываем.

Например, для thymeleaf
<div class="comments" th:each="comment : ${comments}"> 
<input th:if="${comment.author} eq ${currentUser}" type="button" value="Отредактировать комментарий"/>
</div>

Или вы можете вместо сравнения объектов сравнить их id и т.д.

А если нужно проверить автора в методе контроллера, то получаем текущего пользователя:
@GetMapping("/edit/{commentId}")
public String editComment(
@PathVariable("commentId") Long commentId,
@AuthenticationPrincipal UserDetails currentUser,
) {
User user = (User) userServiceImpl.findUserByEmail(currentUser.getUsername());
/*
Далее находим комментарий по его id. находим его автора и сравниваем с user.
*/

}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы