使用当前用户ID设置数据范围时,用户ID没有被代入

* 描述问题

我在页面中添加了一个表,设置数据范围的时候用了"最后修改人ID 等于当前用户ID"筛选条件。
但是设置之后表变成空的,即使表中有一些数据的最后修改人是当前用户。
通过log发现请求中的filter是 “filter”:{“$and”:[{“updatedBy”:{“id”:{“$eq”:“{{$user.id}}”}}}]}}

我申请了一个demo网站,执行了相同的操作,能够正确地筛选数据,并且log中的filter是"filter":{“$and”:[{“updatedBy”:{“id”:{“$eq”:2}}}]}

也就是说,在我部署的网站中进行筛选时,"{{$user.id}}"没有被正确代入为当前用户的ID, 导致数据范围设置错误。这是什么原因导致的,应该怎么解决?

* 运行环境

  • NocoBase 版本:
  • 数据库种类与版本: MySQL
  • 操作系统: Ubuntu
    -浏览器及版本 edge
  • 部署方式: docker
  • Docker 镜像版本: 1.3.49
  • NodeJS 版本:

如何重现

预期行为

我部署的nocobase的log

截图

申请的demo网站的log

日志

{“level”:“info”,“message”:“response /api/uiSchemas:patch”,“method”:“POST”,“path”:“/api/uiSchemas:patch”,“res”:{“status”:200},“action”:{“actionName”:“patch”,“resourceName”:“uiSchemas”,“params”:{“resourceName”:“uiSchemas”,“actionName”:“patch”,“values”:{“x-uid”:“akjyey1v3in”,“x-decorator-props”:{“action”:“list”,“params”:{“filter”:{“$and”:[{“customerBindsale”:{“employerUserID”:{“id”:{“$eq”:“{{$user.id}}”}}}}]},“pageSize”:200},“rowKey”:“customerID”,“dragSort”:true,“showIndex”:true,“collection”:“customers”,“dataSource”:“main”,“dataLoadingMode”:“auto”}}}},“userId”:2,“status”:200,“cost”:75,“app”:“main”,“reqId”:“a2933eac-dbc1-4804-bed0-8f75bf2ef0bf”,“bodySize”:24,“timestamp”:“2024-12-06 20:08:57”}

{“level”:“info”,“message”:“filter-parse: “,“meta”:{”$user”:{“id”:13}},“module”:“customers”,“submodule”:“list”,“method”:“”,“app”:“main”,“reqId”:“dce7403e-b5de-4815-9e1d-3b0db0b30f6e”,“dataSourceKey”:“main”,“timestamp”:“2024-12-06 20:08:57”}

绝了,在请求中 “userId”:2的情况下,还能"meta":{“$user”:{“id”:13}}

{“level”:“info”,“message”:“response /api/uiSchemas:patch”,“method”:“POST”,“path”:“/api/uiSchemas:patch”,“res”:{“status”:200},“action”:{“actionName”:“patch”,“resourceName”:“uiSchemas”,“params”:{“resourceName”:“uiSchemas”,“actionName”:“patch”,“values”:{“x-uid”:“akjyey1v3in”,“x-decorator-props”:{“action”:“list”,“params”:{“filter”:{“$and”:[{“customerBindsale”:{“employerUserID”:{“id”:{“$eq”:“{{$user.id}}”}}}}]},“pageSize”:200},“rowKey”:“customerID”,“dragSort”:true,“showIndex”:true,“collection”:“customers”,“dataSource”:“main”,“dataLoadingMode”:“auto”}}}},“userId”:2,“status”:200,“cost”:75,“app”:“main”,“reqId”:“a2933eac-dbc1-4804-bed0-8f75bf2ef0bf”,“bodySize”:24,“timestamp”:“2024-12-06 20:08:57”}

{“level”:“info”,“message”:“filter-parse: “,“meta”:{”$user”:{“id”:13}},“module”:“customers”,“submodule”:“list”,“method”:“”,“app”:“main”,“reqId”:“dce7403e-b5de-4815-9e1d-3b0db0b30f6e”,“dataSourceKey”:“main”,“timestamp”:“2024-12-06 20:08:57”}

第一个请求是 “reqId”:“a2933eac-dbc1-4804-bed0-8f75bf2ef0bf”
第二个请求是 “reqId”:“dce7403e-b5de-4815-9e1d-3b0db0b30f6e”

不是一条请求

你好,正常情况下,数据范围这里的 “当前用户” 变量是放到后端解析的。所以前端传输的就是 “filter”:{“$and”:[{“updatedBy”:{“id”:{“$eq”:“{{$user.id}}”}}}]}} 这样的字样。然后后端去解析 {{$user.id}}”}} 的值。

你提供的日志信息,看起来是一些不相关的信息。查看这里的请求参数,最简单的方法就是在浏览器的开发者工具里查看。如下图所示:

demo网站前端向后端发送的请求是“{{$user.id}}”,但是log中显示的是2, 这个过程中useid是需要被替换成实际的值而不是直接使用变量名

一次刷新动作会产生4条请求

而且我检查过所有数据,从实际结果来看,我登录的是ID为2的账户,设置数据范围之后筛选出来的数据的最后修改人是ID为13的用户