Thymeleaf выражение ограничения доступа в представлении

Делаю веб приложение на Spring Boot с использованием Spring Security и Thymeleaf. Представление является страницей с комментариями, которые можно добавлять, просматривать, редактировать и удалять. Мне нужно поставить в представлении ограничение, чтобы на странице комментариев под каждым комментарием кнопка "изменить комментарий" появлялась только у того пользователя, который является автором комментария, но я не знаю как это выразить на языке Thymeleaf.

Я нашел в интернете вот такие конструкции:

<div th:if="${#authorization.expression('hasRole(''ROLE_ADMIN'')')}">
  ADMIn section
</div>
<div sec:authentication="name">
<div sec:authentication="principal.authorities">.

Но не знаю как это правильно переформулировать для моего случая. Спасибо.


Ответы (1 шт):

Автор решения: Byb

Ну, предположим, что у вас уже имеются функции по извлечению из Authentication фактического security-юзера от того класса, который имплементит UserDetails. Включая проверку на то, вошёл ли вообще пользователь в систему и так далее.

В таком случае в том контроллере, который возвращает страницу с комментариями, вы можете передавать извлечённого пользователя Thymeleaf-форме, а ещё лучше, если в целом информация о нём не нужна, - только его айдишник:

@RequestMapping("/comments")
public String comments(Model model, Authentication authentication) {
    YourSecurityUser user = extractCurrentUserOrNull(authentication); // примерно
    model.addAttribute("currentUserId", user.getId());
    model.addAttribute("comments", comments); // условно List<Comment>
    return "comments";
}

Теперь Thymeleaf-форма имеет информацию об айди того пользователя, который будет далее просматривать страницу. Помимо этого она, разумеется, оперирует также и списком комментариев. Каждый комментарий имеет автора и, скорее всего, вы его можете получить как-то так:

comment.author

А стало быть, и его идентификатор:

comment.author.id

Это я уже написал под синтаксис Thymeleaf-а.

Теперь непосредственно в представлении нам надо проверять, совпадает ли айди автора очередного комментария с переданным идентификатором текущего пользователя. При совпадении отображаем кнопку редактирования, в противном случае скрываем.

Если для работы со списком комментариев в представлении вы используете стандартный th:each, то тогда можно сделать примерно так:

<div th:each="each : ${comments}">
    ...
    <div th:if="${currentUserId != null AND each.author.id == currentUserId}">

Наконец, роли и права в данном случае не при чём. Здесь вся работа завязана только на определении авторства. Хотя если вы хотите сделать очень дотошную систему ролей и прав, то можете, например, создавать права по типу EDIT_OWN_COMMENTS и проверять наличие этого права у пользователя вместе с тем, что я написал выше.

→ Ссылка