Shopware 6中如何通过Context限制订单文档访问权限?
问题
我们构建了一个自定义端点用于获取订单关联的文档,通过注入document.repository并依据orderId搜索文档。但发现只要知道文档ID,无论传入的sw-context-token是什么,任意用户都能获取该文档。我们是不是错误地认为,向仓库搜索方法传入Context时,它会自动处理用户对返回资源的访问权限?
另外,我们采用这种方式获取文档,是因为要拿到sent状态为0的订单文档;如果通过请求订单实体加载关联文档,只会返回已发送(sent状态非0)的文档。
解答
1. 关于仓库权限处理的误解
没错,你们的理解确实有误。Shopware的Repository不会自动基于传入的Context处理资源访问权限——基础的搜索方法只负责执行数据查询逻辑,权限校验需要你手动实现,或者借助Shopware的权限机制来完成。
2. 手动添加权限校验的可行方案
要解决这个问题,你需要在自定义端点里加上两层校验逻辑:
- 文档归属校验:确认当前用户(通过
sw-context-token解析出的上下文)有权访问对应订单的文档。可以从上下文里拿到当前用户ID,再和订单关联的用户ID做比对;如果是管理员用户,可以跳过这一步校验。 - 状态过滤逻辑:保留你当前对
sent=0的过滤规则,但要和权限校验一起执行。
以下是核心逻辑的伪代码示例:
// 从上下文获取当前用户 $currentUser = $context->getUser(); // 通过orderId获取订单,同时确保订单存在 $order = $this->orderRepository->search(new Criteria([$orderId]), $context)->first(); if (!$order) { throw new NotFoundHttpException('订单不存在'); } // 权限校验:普通用户只能访问自己的订单,管理员无限制 if (!$currentUser->isAdmin() && $order->getCustomerId() !== $currentUser->getId()) { throw new AccessDeniedHttpException('无权限访问该文档'); } // 搜索该订单下sent状态为0的文档 $documents = $this->documentRepository->search( (new Criteria()) ->addFilter(new EqualsFilter('orderId', $orderId)) ->addFilter(new EqualsFilter('sent', 0)), $context );
3. 替代方案:扩展订单实体的关联规则
如果不想维护自定义端点,也可以通过扩展订单实体的文档关联配置,调整默认的状态过滤条件。在自定义插件的src/Resources/config.xml里修改关联设置:
<entity name="order"> <association name="documents"> <filter> <and> <filter type="equals" field="sent" value="0"/> <!-- 保留原有其他过滤规则(如果有) --> </and> </filter> </association> </entity>
注意:这种方式会全局修改订单文档的关联返回结果,需要先评估是否符合你的整体业务需求。
内容的提问来源于stack exchange,提问作者loken
相关产品推荐
相关产品推荐

