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

标签 java spring spring-boot jpa

我正在使用 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)

尽管用户没有访问 4711 号房屋的权限,但他将家具 4712 与 4711 号房屋“取消链接”,而是将其链接到 99991337 号房屋。

如何禁止更换家具之家?

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

最佳答案

如果我的理解是正确的,只需通过请求中提供的 userIdhouseId 搜索权限表即可。 如果匹配,则用户有权更改 houseId

根据权限,您可以将 houseId 设置为要保存到数据库的对象,也可以不设置。

如果您仍然希望用户更改 家具数据,那么您可以通过提供 furnitureIdtext 仅保存 furniture 实体 用于 new Furniture() 对象。

关于java - 如何防止实体关系发生变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50434633/

相关文章:

java - 如何更改 JDBC 编码以支持法语重音字符

java - JDT AST,如何生成声明

java - Spring Batch 使用@JobScope 中的步骤定义基于 java 的条件流

java - Spring Boot 正在缓存结果而不启用它

spring - 将 Spring Security 全局方法安全性与 Keycloak 集成

java - 双向异步 Java RPC

java - 从 String 实例中删除空白字符

spring - 范围 'session' 对当前线程无效;非法状态异常 : No thread-bound request found

java - 状态预期为 :204 Actual :404

java - 在 Spring Boot 中使用系统变量