맞춤 게시물 유형별로 특정 REST 동사를 제한하려고합니다. 예를 들어 어휘 사용자 정의 게시물 유형이 주어지면 다음과 같이 말하고 싶습니다.
권한 매트릭스
+-------+---+----------+
|index | X | GET |
|show | O | GET |
|create | X | POST |
|update | X | PATCH/PUT|
|delete | X | DELETE |
+-------+---+----------+
V2는 그런 수준의 제어를 제공하지 않는 것 같습니다. 나는 소스를 살펴 보았고, 내가 볼 수 있듯이, 권한 변경에 활용할 수있는 후크 / 필터가 없습니다.
내 현재 솔루션은 다음과 같습니다. 허용 된 작업에 대해 사용자 지정 게시물 유형의 매트릭스로로드 할 수있는 클래스를 손상시킵니다. 그런 다음 rest_prepare_vocabulary
필터 에서 호출 하여 권한이 정렬되지 않은 경우 응답을 제거 할 수 있습니다.
문제
이것이 합리적인 해결책이라고 생각하지 않습니다. 그것은 권한이 두 개의 스팟 (하나는 여전히 적용되는 코어에서)과 내 필터에서 해결되고 있음을 의미합니다.
이상적으로는 구성 수준, 즉 사용자 지정 게시물 유형이 정의 된 위치에 있습니다.
즉, 나는 규칙 (의 라인을 따라 통과하는 것을 선호 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로 이것을 대답하면 대신 필터에 첨부 할 수 있습니다.