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

如何在WooCommerce中限制API仅返回认证用户自身数据?

解决方案:限制WooCommerce REST API客户仅访问自身数据

方法1:修改下载记录端点的权限要求(推荐)

你不需要给客户角色分配list_users权限,直接通过钩子自定义/wc/v3/customers/{id}/downloads端点的权限校验逻辑,让客户只能访问自己的下载记录,同时避免获取所有客户数据的风险。

将以下代码添加到主题的functions.php文件或自定义插件中:

add_filter( 'woocommerce_rest_endpoints', 'adjust_downloads_endpoint_permission' );
function adjust_downloads_endpoint_permission( $endpoints ) {
    // 定位客户下载记录的API端点
    if ( isset( $endpoints['/wc/v3/customers/(?P<id>[\d]+)/downloads'] ) ) {
        foreach ( $endpoints['/wc/v3/customers/(?P<id>[\d]+)/downloads'] as &$method ) {
            // 替换默认权限回调
            $method['permission_callback'] = function() {
                $current_user = wp_get_current_user();
                // 管理员和店铺经理不受限制
                if ( in_array( 'administrator', $current_user->roles ) || in_array( 'shop_manager', $current_user->roles ) ) {
                    return true;
                }
                // 获取请求中的客户ID,仅允许匹配当前登录用户ID的请求
                $request = wp_rest_request::get_current_request();
                $customer_id = $request->get_param( 'id' );
                return $customer_id == $current_user->ID;
            };
        }
    }
    return $endpoints;
}

这段代码的作用是:

  • 直接修改下载记录端点的权限校验规则
  • 管理员/店铺经理可以正常访问所有客户的下载记录
  • 普通客户只能访问ID与自身用户ID匹配的下载记录,无需额外分配list_users权限

方法2:已分配list_users权限时的过滤方案

如果已经给客户角色加了list_users权限,可通过钩子拦截客户相关的API请求,强制返回当前用户自身的数据:

// 校验客户API请求的权限
add_filter( 'woocommerce_rest_check_permissions', 'restrict_customer_to_own_data', 10, 4 );
function restrict_customer_to_own_data( $permission, $context, $object_type, $object_id ) {
    // 仅处理客户类型的API端点
    if ( $object_type !== 'customer' ) {
        return $permission;
    }

    $current_user = wp_get_current_user();
    
    // 管理员和店铺经理不受限制
    if ( in_array( 'administrator', $current_user->roles ) || in_array( 'shop_manager', $current_user->roles ) ) {
        return $permission;
    }

    // 普通客户角色的权限限制
    if ( in_array( 'customer', $current_user->roles ) ) {
        // 单个客户请求:仅允许访问自身ID
        if ( $object_id && $object_id != $current_user->ID ) {
            return false;
        }
        // 客户列表请求:强制只返回当前用户的数据
        if ( !$object_id && $context === 'read' ) {
            add_filter( 'woocommerce_rest_customer_query', 'filter_customer_list_to_self', 10, 2 );
        }
    }

    return $permission;
}

// 过滤客户列表查询结果
function filter_customer_list_to_self( $args, $request ) {
    $current_user = wp_get_current_user();
    $args['include'] = array( $current_user->ID );
    return $args;
}

这段代码的作用是:

  • 拦截所有客户相关的API请求
  • 普通客户无法访问其他客户的数据,列表请求只会返回自身的客户信息
  • 管理员和店铺经理的权限不受影响

内容的提问来源于stack exchange,提问作者dustbro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 21:01:02