You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 23:32:50