Özel yazı türü başına belirli RESTUL fiillerini kısıtlamayı hedefliyorum. Örneğin, bir Kelime özel yazı türü verildiğinde şunu söylemek isterim:
İzin Matrisi
+-------+---+----------+
|index | X | GET |
|show | O | GET |
|create | X | POST |
|update | X | PATCH/PUT|
|delete | X | DELETE |
+-------+---+----------+
V2 bu kontrol seviyesini sağlamıyor gibi görünüyor. Kaynaktan geçtim ve görebildiğim kadarıyla, izinleri değiştirmek için herhangi bir kanca / filtre yok.
Şu anki çözümüm şudur. İzin verilen eylemlere karşı özel yazı türleri matrisine yükleyebileceğiniz bir sınıftan ödün verir. Bu daha sonra rest_prepare_vocabulary
filtrede çağrılabilir ve izinler sıralanmazsa yanıtı yok edebilir.
Sorun
Bunun makul bir çözüm olduğunu düşünmüyorum. Bu, izinlerin iki noktada (biri hala uygulandıkları gibi çekirdekte) ve filtrelerimde çözüldüğü anlamına gelir.
İdeal olarak, konfigürasyon düzeyinde, yani özel yazı tiplerinin tanımlandığı yerde olacaktır.
Başka bir deyişle, ben bir sonrası sorgusu "snip" yerine exclude_from_search
, kuralları ( publicly_queryable
, vb . Satırları boyunca) geçmek tercih ediyorum .
Mevcut çözüm (çalışıyor ancak istenmiyor)
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
ve erişim aslında\App\Services\Access
Access
küresel kapsamda başladınız ? Başka bir yere mi ihtiyacınız var? Buna evet ile cevap verirseniz , bunun yerine bir filtreye eklemek isteyebilirsiniz.