Sto mirando a limitare alcuni verbi RESTUL per tipo di post personalizzato. Ad esempio, dato un tipo di post personalizzato Vocabolario, vorrei dire:
Matrice di autorizzazione
+-------+---+----------+
|index | X | GET |
|show | O | GET |
|create | X | POST |
|update | X | PATCH/PUT|
|delete | X | DELETE |
+-------+---+----------+
Il V2 non sembra fornire quel livello di controllo. Ho esaminato la fonte e, da quello che posso vedere, non ci sono hook / filtri da utilizzare per modificare le autorizzazioni.
La mia attuale soluzione è la seguente. Compromette una classe in cui è possibile caricare una matrice di tipi di post personalizzati rispetto alle azioni consentite. Questo può quindi essere chiamato nel rest_prepare_vocabulary
filtro, distruggendo la risposta se le autorizzazioni non si allineano.
Problema
Non mi sembra che questa sia una soluzione ragionevole. Significa che le autorizzazioni sono state risolte in due punti (uno, nel nucleo, poiché sono ancora applicati) e nei miei filtri.
Idealmente, sarebbe a livello di configurazione, ovvero dove sono definiti i tipi di posta personalizzati.
In altre parole, io preferirei passare nelle regole (lungo le linee di exclude_from_search
, publicly_queryable
ecc) piuttosto che l'esecuzione di una query post "snip".
Soluzione attuale (funziona ma non desiderabile)
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
e l'accesso è in realtà\App\Services\Access
Access
nell'ambito globale? Ne hai bisogno altrove? Nel caso in cui tu risponda con sì , potresti invece collegarlo a un filtro.