WordPress REST API — мощный инструмент для взаимодействия с сайтом из внешних приложений и создания сложных фронтендов. Однако при открытии API важно грамотно ограничить доступ к данным в зависимости от роли пользователя, чтобы избежать утечек информации и повысить безопасность.
Почему важно ограничивать доступ к WP REST API по ролям
По умолчанию REST API в WordPress открывает множество данных, включая публичные записи и метаданные. Но когда речь идет о пользовательских данных, конфиденциальной информации или административных возможностях, необходимо контролировать, кто и что может получить через API.
Без правильной фильтрации любой анонимный пользователь сможет получить доступ к нежелательной информации, что представляет угрозу безопасности и конфиденциальности.
Примером может служить сайт с несколькими типами пользователей: подписчики, редакторы, администраторы. Каждой роли нужен разный уровень доступа к API.
Как работает проверка прав в WP REST API
Каждое REST API-эндпоинт в WordPress содержит callback-функции, которые обрабатывают запросы. Для проверки прав доступа используется параметр permission_callback, где можно задать функцию, возвращающую true или false в зависимости от условий.
Например, базовая проверка на авторизацию пользователя может выглядеть так:
function wpeducation_permission_callback() {
return is_user_logged_in();
}Но этого мало, чтобы разграничить доступ по ролям — нужно детальнее проверять роль текущего пользователя.
Пример: разрешение доступа к API только для редакторов и администраторов
Создадим свой эндпоинт, доступный только для пользователей с ролями editor и administrator. Для примера отдавать будем список последних 5 публикаций.
add_action('rest_api_init', 'wpeducation_register_custom_endpoint');
function wpeducation_register_custom_endpoint() {
register_rest_route('wpeducation/v1', '/latest-posts/', array(
'methods' => 'GET',
'callback' => 'wpeducation_get_latest_posts',
'permission_callback' => 'wpeducation_check_user_roles',
));
}
function wpeducation_check_user_roles() {
if (!is_user_logged_in()) {
return false;
}
$user = wp_get_current_user();
$allowed_roles = array('editor', 'administrator');
return array_intersect($allowed_roles, $user->roles);
}
function wpeducation_get_latest_posts() {
$args = array(
'numberposts' => 5,
'post_status' => 'publish'
);
$posts = wp_get_recent_posts($args);
return rest_ensure_response($posts);
}В этом примере функция wpeducation_check_user_roles проверяет, что пользователь авторизован и его роль входит в разрешённый список. Если условие не выполняется, запрос вернёт ошибку 403.
Разбор кода
- Хук
rest_api_initрегистрирует новый маршрут/wpeducation/v1/latest-posts/. permission_callbackконтролирует доступ — ключевой момент для безопасности.- Функция возвращает последние 5 опубликованных постов в формате JSON.
Как использовать проверку ролей для стандартных REST API маршрутов WordPress
Иногда нужно ограничить доступ к уже существующим эндпоинтам, например, к маршрутам для получения пользователей или записей. Для этого можно использовать фильтр rest_endpoints и менять права на лету.
Пример ограничения доступа к списку пользователей только администраторам:
add_filter('rest_endpoints', 'wpeducation_restrict_users_endpoint');
function wpeducation_restrict_users_endpoint($endpoints) {
if (isset($endpoints['/wp/v2/users'])) {
foreach ($endpoints['/wp/v2/users'] as &$endpoint) {
$endpoint['permission_callback'] = function () {
return current_user_can('administrator');
};
}
}
return $endpoints;
}Этот код перебирает маршрут /wp/v2/users и заменяет функцию проверки прав на новую, которая разрешает доступ только администраторам.
Рекомендации по безопасности при работе с WP REST API
1. Всегда используйте permission_callback для проверки прав доступа, особенно для нестандартных эндпоинтов.
2. Отдавайте минимально необходимый набор данных. Не возвращайте лишних полей, которые могут раскрыть внутренние детали сайта.
3. Если вы создаёте публичные API, подумайте про ограничения скорости запросов и анонимный доступ.
4. Для управления ролями и разрешениями можно использовать плагины, например, Clearfy Pro, которые помогают тонко настраивать права и повышать безопасность.
Пример: добавление кастомных полей в ответ REST API с проверкой роли
Если вам нужно добавить в ответ API дополнительные данные, например, поле user_phone из метаполя пользователя, и показывать его только администраторам, можно использовать фильтр rest_prepare_user:
add_filter('rest_prepare_user', 'wpeducation_add_custom_user_data', 10, 3);
function wpeducation_add_custom_user_data($response, $user, $request) {
if (!current_user_can('administrator')) {
return $response;
}
$user_phone = get_user_meta($user->ID, 'user_phone', true);
$response->data['user_phone'] = $user_phone ? $user_phone : '';
return $response;
}Так мы расширяем стандартный ответ API, но только для пользователей с ролью администратора.
Выводы
Грамотная настройка прав доступа в WP REST API — обязательный шаг при разработке современных сайтов на WordPress. Использование permission_callback, проверка ролей, фильтрация данных — всё это позволяет защитить сайт и обеспечить адекватный доступ.
В дополнение к написанному, советую протестировать API с разными ролями, использовать инструменты типа Postman и рассмотреть плагины вроде WPCommunity для расширенных возможностей работы с пользователями через API.