Saya bertujuan untuk membatasi kata kerja RESTUL tertentu per jenis posting kustom. Misalnya, mengingat jenis posting khusus Kosakata, saya ingin mengatakan:
Matriks Izin
+-------+---+----------+
|index | X | GET |
|show | O | GET |
|create | X | POST |
|update | X | PATCH/PUT|
|delete | X | DELETE |
+-------+---+----------+
V2 tampaknya tidak memberikan tingkat kontrol itu. Saya telah menelusuri sumbernya, dan dari apa yang dapat saya lihat, tidak ada kait / filter untuk memanfaatkan perubahan izin.
Solusi saya saat ini adalah sebagai berikut. Ini mengkompromikan kelas di mana Anda dapat memuat dalam matriks jenis posting khusus terhadap tindakan yang diizinkan. Ini kemudian dapat disebut dalam rest_prepare_vocabulary
filter, menghancurkan respons jika izin tidak berbaris.
Masalah
Saya tidak merasa ini solusi yang masuk akal. Itu berarti izin sedang diselesaikan di dua tempat (satu, di inti, karena masih diterapkan) dan di filter saya.
Idealnya, ini akan berada pada tingkat konfigurasi, yaitu di mana jenis posting kustom didefinisikan.
Dengan kata lain, saya akan lebih memilih untuk lulus dalam aturan (sepanjang garis exclude_from_search
, publicly_queryable
, dll) daripada melakukan query posting "snip".
Solusi saat ini (berfungsi tetapi tidak diinginkan)
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
dan Akses sebenarnya\App\Services\Access
Access
dalam lingkup global? Apakah Anda membutuhkannya di tempat lain? Jika Anda menjawab ini dengan ya , Anda mungkin ingin melampirkannya ke filter.