如何保护Spring Data REST关联请求?

时间:2019-03-24 15:30:57

标签: java spring spring-security spring-data-rest

我已经使用Spring Data REST创建了REST API。我有实体UserPost,其中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"
}

但是,在这种方法中,同样的问题。任何用户都可以添加到任何帖子中。

现在,我只看到一个解决此问题的方法-自定义剩余存储库,并检查添加的用户是否为当前经过身份验证的用户。

1 个答案:

答案 0 :(得分:1)

查看您的用例“只有用户对其POST上的CRUD操作负责”

是的,解决此问题的一种方法是“正在自定义其余存储库,并检查添加的用户是否为当前经过身份验证的用户。”

假设您具有Spring Security

我建议您不要为帖子传递任何用户ID,并从安全上下文或令牌中从登录的用户ID中提取用户。

这样,您的帖子将在API级别独立于用户。