カスタム投稿タイプごとに特定のRESTUL動詞を制限することを目指しています。たとえば、語彙のカスタム投稿タイプが与えられた場合、私は言いたいと思います:
許可マトリックス
+-------+---+----------+
|index | X | GET |
|show | O | GET |
|create | X | POST |
|update | X | PATCH/PUT|
|delete | X | DELETE |
+-------+---+----------+
V2はそのレベルの制御を提供していないようです。私はソースを調べましたが、私が見ることができるものから、アクセス権の変更を利用するフック/フィルターはありません。
私の現在の解決策は次のとおりです。許可されたアクションに対してカスタム投稿タイプのマトリックスをロードできるクラスの妥協。これはrest_prepare_vocabulary
フィルターで呼び出すことができ、権限が揃っていない場合は応答を破棄します。
問題
これが合理的な解決策だとは思わない。これは、アクセス許可が2つのスポット(まだ適用されているコアの1つ)とフィルターで解決されていることを意味します。
理想的には、構成レベル、つまりカスタム投稿タイプが定義される場所になります。
言い換えると、ポストクエリ "snip"を実行するよりもexclude_from_search
、(publicly_queryable
、などの行に沿って)ルールを渡すことを好みます。
現在のソリューション(機能するが望ましくない)
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
、アクセスは実際には\App\Services\Access
Access
グローバルスコープでインスタンス化したのですか?他の場所で必要ですか?これにyesと答えた場合、代わりにフィルターに添付することをお勧めします。