如何在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
相关产品推荐
相关产品推荐

