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 шт):
Ну, предположим, что у вас уже имеются функции по извлечению из 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 и проверять наличие этого права у пользователя вместе с тем, что я написал выше.