javascript - 如何确保 hibernate 版本号在 javascript 客户端中保持不可变?

标签 javascript rest frontend javascript-security

我有一个带有 Java 和 Hibernate 的 Rest 后端,并且我使用带有版本属性的乐观锁定。 对于并发控制,此版本属性必须发送到客户端,然后通过 post 请求再次发送到服务器。 但是,在 javascript 客户端中,我失去了对此属性完整性的控制,例如:

  • 客户端“A”请求资源 1。
  • 客户端“B”请求相同的资源。
  • 服务器使用资源 1 版本 1 向两个客户端进行响应(在各自的响应中)
  • 客户端“A”修改资源并发布帖子以保存更改。
  • 服务器处理 post 请求,Hibernate 检查版本号。 1 = 1,因此资源被修改。
  • 客户端B玩了javascript,将version属性修改为2,并发出post请求。 服务器处理 post 请求,现在 2 = 2,因此资源被修改,客户端 A 所做的更改丢失。

请记住,这是一个 Rest 后端,因此我无法在服务器中保存传递给每个用户的对象的版本号,或者类似的东西。

那么,如果这是一个像我认为的那样的有效问题,我如何确保版本在客户端中保持不可变?

最佳答案

就我个人而言,我会重新考虑这样做,因为我认为客户端几乎没有动机这样做,并且根据定义,您无法控制客户端发送到 REST 服务的内容。

但是,如果您确实有业务案例,那么一种半解决方案是将版本属性设置为 GUID。这样,只有在拥有最新的 GUID 时才可以提交,而客户端 B 则不会拥有,并且这会使版本控制情况变得更加复杂,因为在请求成功之前不能只加 1。

但是,即使在那里,您也并不完全安全,因为理论上客户端 B 可以执行单独的请求以从资源获取更新的 GUID,然后使用更新的 GUID 重新提交失败的请求。

但是由于客户端 B 可以对更新版本进行编辑以恢复客户端 A 所做的操作并添加自己的操作,因此这本质上与执行此操作相同,并且由于他们有权这样做,因此我们又回到询问我们自己为什么再次担心这个案子。

关于javascript - 如何确保 hibernate 版本号在 javascript 客户端中保持不可变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29973919/

相关文章:

javascript - 使用loopback.io创建一个新项目

javascript - 正则表达式替换指令中的 html 标签

java - @GetMapping 返回列表为空的字符串信息

java - 在 REST API 中使用 POST 方法而不是 GET

javascript - 一个组件中的 ngForm 给出表单值,其他组件中的相同代码给出未定义

javascript - 前端和服务器共享相同的模型

javascript - 如何将下拉菜单与按钮对齐

javascript - 单击 anchor 标记时添加效果

REST:如何告诉服务器做一些后台进程

javascript - 动态搜索输入作为密码变量