Как защитить запросы ассоциаций Spring Data REST?

Я создал 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"
}

Но и в этом методе та же проблема. Любой пользователь может быть добавлен в любой пост.

Теперь я вижу только одно решение этой проблемы - настроить репозиторий отдыха и проверить, является ли добавленный пользователь текущим аутентифицированным пользователем.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
100
1

Ответы 1

Глядя на ваш вариант использования «Только пользователь несет ответственность за операцию CRUD на своем POST»

Да, одним из способов решения этой проблемы было бы «настроить репозиторий отдыха и проверить, является ли добавленный пользователь текущим аутентифицированным пользователем».

Предполагая, что у вас есть Spring Security

Я бы посоветовал вам не передавать идентификатор пользователя для ваших сообщений и выбрать пользователя из идентификатора пользователя, вошедшего в систему, из контекста безопасности или из токена.

Таким образом, ваш пост будет независим от пользователя на уровне API.

Другие вопросы по теме