如何防止实体关系发生变化?

2022-09-04 04:34:41

我正在使用spring boot通过JPA在我们的数据库中存储复杂的json结构。

json 结构的根表示一个“House”对象。“房屋”对象包含多个“家具”。例如:

House ID: 4711
|- Furniture: ID 4712 (with confidential information)

用户对某些房屋及其所有“家具”具有读/写权限。

我的问题是,通过REST-API,用户可以从其他房屋“窃取”家具,如果他知道他们的主键;像这样的请求:

POST http://localhost:8080/house

{
    houseId: 99991337,
    furnitures: [{
        furnitureId: 4712,
        ...
    }]
}

这导致:

House ID: 4711
|- empty!

House ID: 99991337
|- Furniture 4712 (with confidential information)

尽管用户没有获得House 4711的许可,但他将家具4712与House 4711“断开链接”,而是将其链接到House 99991337。

如何禁止更换家具屋?

在JPA实体中,存在从房屋到家具的双向一对多关系。我想过也许可以在数据库中搜索任何传入请求的家具,检查所有权限。但我宁愿只需要检查房子的许可(因为在现实生活中,我有更多的实体,如家具)


答案 1

如果我的理解是正确的,只需搜索请求中提供的权限表即可。如果存在匹配项,则用户有权更改 .userIdhouseIdhouseId

根据权限,您可以设置或未设置为要保存到数据库中的对象。houseId

如果仍希望用户更改,则可以通过为对象提供 和 来仅保存实体。furniture datafurniturefurnitureIdtextnew Furniture()


答案 2

首先,您的请求结构不正确。出于这样的安全原因,您无法要求用户提供他的用户ID,houseid等。您需要在后台处理它,而不依赖于用户请求。

但对于这种情况,您只需使用选择插入来更改插入语句即可。加入权限表以选择语句以检查给定的id是否附加到相关用户。如果没有插入任何内容,用户将尝试插入非法 ID。


推荐