Я создал REST API, используя Spring Data REST. У меня есть сущности User и Post, где User может иметь несколько сообщений (один ко многим). Теперь мне нужно добавить сообщения моему пользователю. Но мне нужно, чтобы у userA не было возможности удалять или обновлять посты userB.
Структура API
{
"_links": {
"users": {
"href": "http://localhost:8081/api/users{?page,size,sort}",
"templated": true
},
"posts": {
"href": "http://localhost:8081/api/posts{?page,size,sort}",
"templated": true
}
"profile": {
"href": "http://localhost:8081/api/profile"
}
}
}
Структура пользователей
{
"id": 1,
"username": null,
"password": null,
"_links": {
"self": {
"href": "http://localhost:8081/api/users/1"
},
"user": {
"href": "http://localhost:8081/api/users/1"
},
"posts": {
"href": "http://localhost:8081/api/users/1/posts"
}
}
}
Есть несколько способов добавить ссылки на связанную сущность.
Используя метод PUT и тип контента text/uri-list:
PUT /api/posts/1/user? HTTP/1.1
Host: localhost:8081
Content-Type: text/uri-list
Authorization: Bearer 270c6dc3-04a5-48cc-b42e-c275472df459
cache-control: no-cache
http://localhost:8081/api/users/1
Но таким образом я могу добавить любой URI в тело и добавить любого случайного пользователя в случайную запись, и я думаю, что здесь есть проблема с безопасностью. Следующий способ добавить связанный ресурс — добавить его в JSON следующим образом:
PATCH /api/posts/1? HTTP/1.1
Host: localhost:8081
Content-Type: application/json
Authorization: Bearer 270c6dc3-04a5-48cc-b42e-c275472df459
cache-control: no-cache
{
"user": "http://localhost:8081/api/users/1"
}
Но и в этом методе та же проблема. Любой пользователь может быть добавлен в любой пост.
Теперь я вижу только одно решение этой проблемы - настроить репозиторий отдыха и проверить, является ли добавленный пользователь текущим аутентифицированным пользователем.




Глядя на ваш вариант использования «Только пользователь несет ответственность за операцию CRUD на своем POST»
Да, одним из способов решения этой проблемы было бы «настроить репозиторий отдыха и проверить, является ли добавленный пользователь текущим аутентифицированным пользователем».
Предполагая, что у вас есть Spring Security
Я бы посоветовал вам не передавать идентификатор пользователя для ваших сообщений и выбрать пользователя из идентификатора пользователя, вошедшего в систему, из контекста безопасности или из токена.
Таким образом, ваш пост будет независим от пользователя на уровне API.