Mam na celu ograniczenie niektórych czasowników RESTUL dla niestandardowego typu postu. Na przykład, biorąc pod uwagę niestandardowy typ słownika, chciałbym powiedzieć:
Macierz uprawnień
+-------+---+----------+
|index | X | GET |
|show | O | GET |
|create | X | POST |
|update | X | PATCH/PUT|
|delete | X | DELETE |
+-------+---+----------+
Wydaje się, że V2 nie zapewnia takiego poziomu kontroli. Przeszedłem przez źródło i z tego, co widzę, nie ma żadnych haków / filtrów, które można by wykorzystać do zmiany uprawnień.
Moje obecne rozwiązanie jest następujące. Jest to kompromis klasy, w której można załadować macierz niestandardowych typów postów przeciwko dozwolonym działaniom. Można to następnie wywołać w rest_prepare_vocabulary
filtrze, niszcząc odpowiedź, jeśli uprawnienia się nie zgadzają.
Problem
Nie wydaje mi się, żeby to rozsądne rozwiązanie. Oznacza to, że uprawnienia są rozwiązywane w dwóch punktach (jeden, w rdzeniu, ponieważ są one nadal stosowane) i w moich filtrach.
Idealnie byłoby na poziomie konfiguracji, czyli tam, gdzie zdefiniowane są niestandardowe typy postów.
Inaczej mówiąc, wolałbym, aby przejść w zasadach (wzdłuż linii exclude_from_search
, publicly_queryable
itp) zamiast wykonywać pocztowy zapytanie „ciach”.
Aktualne rozwiązanie (działa, ale nie jest pożądane)
Access.php
class Access
{
function __construct($permissions) {
$this->permissions = $permissions;
}
protected function hasId($request) {
return ! is_null($request->get_param('id'));
}
protected function resolveType($request) {
$method = strtoupper($request->get_method());
if($method === 'GET' && $this->hasId($request)) {
return 'show';
} else if($method === 'GET') {
return 'index';
} else if($method === 'DELETE') {
return 'delete';
} else if($method === 'POST') {
return 'create';
} else if($method === 'PATCH') {
return 'update';
}
}
function validate($type, $request) {
return in_array($this->resolveType($request), $this->permissions[$type]);
}
}
functions.php
// bootstrap the permissions for this particular
// application
//
$access = new Access([
'vocabulary' => ['show'],
]);
add_filter('rest_prepare_vocabulary', 'validate_permissions', 30, 3);
function validate_permissions($response, $post, $request) {
global $access;
// Give access->validate the type + request data
// and it will figure out if this is allowed
//
if( ! $access->validate($post->post_type, $request)) {
$response->set_data([]);
$response->set_status(403);
}
return $response;
};
\App
i dostęp jest w rzeczywistości\App\Services\Access
Access
w globalnym zasięgu? Potrzebujesz go gdzie indziej? Jeśli odpowiesz tak , możesz zamiast tego dołączyć filtr.