Rest V2 (WP4.7) ile belirli RESTFUL fiiller nasıl sınırlandırılır?


20

Ö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_vocabularyfiltrede ç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;
};

1
Neden Accesskü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.
kaiser

3
Adil soru - Yukarıdaki sadece bir snippet, sınıf modülleri yukarıdaki snippet'in olacağı bir üst App sınıfına çizmek için besteci ve PSR4 otomatik yükleme kullanıyorum - bu aslında küresel küresel değil, isimlendirilecek \Appve erişim aslında\App\Services\Access
Chris

1
Bu sorunu kendim araştırmadım, ancak Trac'ı bir bilet için kontrol ettiniz mi yoksa yoksa bir bilet mi oluşturdunuz? Sahip olmak için makul bir özellik gibi geliyor ...
Kraft

1
Sorunu gerçekten anlamıyorum. "Bu, izinlerin iki noktada (bir tanesi hala uygulandıkları gibi çekirdekte) ve filtrelerimde çözüldüğü anlamına gelir. İdeal olarak, yapılandırma düzeyinde yani özel yazı türlerinin tanımlandığı yerde olacaktır. Burada ne demek istediğinizi açıklığa kavuşturabilir misiniz? Aptalsam özür dilerim!
Jim Maguire

2
Bu soruyu küçümsüyorum. Neden 18 kişinin onu iptal ettiğini anlamıyorum. Bu anlaşılmaz.
Jim Maguire

Yanıtlar:


1

Kaynaktan geçtim ve görebildiğim kadarıyla, izinleri değiştirmek için herhangi bir kanca / filtre yok.

Anladığım kadarıyla, bu kasıtlı bir tasarım kararıdır.

REST API'sı genişletilebilir olacak şekilde oluşturulmuş olsa da, çekirdek uç noktalarını istediğiniz şekilde değiştirmeniz önerilmez.

REST API el kitabının bu bölümünde bazı sınırlı bilgiler bulunmaktadır , ancak bunun özü, API eskidikçe, daha fazla kodun (ister çekirdek ister üçüncü taraf olsun) mevcut olan ve standart sağlayan belirli eylemlere bağlı olmaya başlayacağıdır. tepkiler.

Bunun yerine özel bir denetleyici oluşturmanız gerekir.

Özel yazı türlerine, rest_controller_classbağımsız değişkeninderegister_post_type() bir sınıf adı belirtilerek özel bir denetleyici verilebilir .

Özel denetleyicilerin nasıl çalışması gerektiğine ilişkin bir genel bakış REST API el kitabında bulunabilir .

Akılda tutulması gereken başka bir şey WP_REST_Controller, revizyonları destekleyen bir yazı tipi için soyut sınıfı genişleten özel bir denetleyici oluşturursanız , bir dizi yazı tipine özgü revizyon uç noktasının otomatik olarak oluşturulacağıdır.

WP_REST_ControllerSınıfı genişletmezse, register_routes()yöntem çağrılmaz, bu nedenle özel rotalarınızı manuel olarak kaydetmeniz gerekir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.