it-swarm.com.de

Wie beschränkt man sich auf Rest V2 (WP4.7) bestimmte RESTFUL-Verben ein?

Ich möchte bestimmte RESTUL-Verben pro benutzerdefiniertem Beitragstyp einschränken. Zum Beispiel möchte ich bei einem benutzerdefinierten Vokabeltyp Folgendes sagen:

Berechtigungsmatrix

+-------+---+----------+
|index  | X | GET      |
|show   | O | GET      |
|create | X | POST     |
|update | X | PATCH/PUT|
|delete | X | DELETE   |
+-------+---+----------+

Die V2 scheint diese Kontrolle nicht zu bieten. Ich habe die Quelle durchgesehen, und nach allem, was ich sehen kann, gibt es keine Haken/Filter, mit denen sich Berechtigungen ändern lassen.

Meine derzeitige Lösung lautet wie folgt. Kompromisse einer Klasse, in der Sie eine Matrix benutzerdefinierter Beitragstypen für zulässige Aktionen laden können. Dies kann dann im rest_prepare_vocabulary-Filter aufgerufen werden, wodurch die Antwort zerstört wird, wenn die Berechtigungen nicht übereinstimmen.

Problem

Ich halte das nicht für eine vernünftige Lösung. Dies bedeutet, dass Berechtigungen an zwei Stellen (eine im Kern, da sie noch angewendet werden) und in meinen Filtern aufgelöst werden.

Idealerweise ist dies eine Konfigurationsebene, in der die benutzerdefinierten Beitragstypen definiert sind.

Mit anderen Worten, ich würde es vorziehen, Regeln (in Anlehnung an exclude_from_search, publicly_queryable usw.) einzugeben, anstatt eine Nachabfrage "snip" durchzuführen.

Aktuelle Lösung (funktioniert aber nicht wünschenswert)

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;
};
20
Chris

Ich habe die Quelle durchgesehen, und nach allem, was ich sehen kann, gibt es keine Haken/Filter, mit denen sich Berechtigungen ändern lassen.

Mein Verständnis ist, dass dies eine beabsichtigte Designentscheidung war.

Während die REST -API so erstellt wurde, dass sie erweiterbar ist, wird nicht empfohlen, die Kernendpunkte auf die von Ihnen gewünschte Weise zu ändern.

In diesem Abschnitt des REST API-Handbuchs stehen einige eingeschränkte Informationen zur Verfügung, aber das Wesentliche ist, dass mit zunehmendem Alter der API mehr Code (unabhängig davon, ob es sich um Kern- oder Drittanbieter handelt) beginnt von der Verfügbarkeit bestimmter Maßnahmen und der Bereitstellung von Standardantworten abhängig zu sein.

Stattdessen sollten Sie einen benutzerdefinierten Controller erstellen.

Benutzerdefinierte Post-Typen können einem benutzerdefinierten Controller zugewiesen werden, indem ein Klassenname im Argument rest_controller_class FÜR register_post_type() angegeben wird.

Eine Übersicht über die Funktionsweise benutzerdefinierter Controller finden Sie im REST API-Handbuch .

Beachten Sie außerdem, dass beim Erstellen eines benutzerdefinierten Controllers, der die abstrakte Klasse WP_REST_Controller für einen Beitragstyp erweitert, der Revisionen unterstützt, automatisch eine Reihe von Beitragstyp-spezifischen Revisionsendpunkten erstellt wird.

Wenn die Klasse WP_REST_Controller nicht erweitert wird, wird die Methode register_routes() nicht aufgerufen, sodass Sie Ihre benutzerdefinierten Routen manuell registrieren müssen.

1
ssnepenthe