Rest V2 (WP4.7)에서 특정 RESTFUL 동사를 어떻게 제한합니까?


20

맞춤 게시물 유형별로 특정 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;
};

1
Access글로벌 범위에서 인스턴스화 했 습니까? 다른 곳에서 필요하십니까? yes로 이것을 대답하면 대신 필터에 첨부 할 수 있습니다.
kaiser

3
페어 질문 - 위의 스 니펫, 나는 작곡가를 사용하고 있으며 PSR4은 위의 코드가 될 것이다의 부모 앱 클래스에 클래스 모듈을 그릴 자동 로딩 - 실제로 글로벌 글로벌하지 그래서, 그것은에 네임 스페이스 될 \App및 접근은 실제로\App\Services\Access
Chris

1
이 문제를 직접 조사하지는 않았지만 Trac에서 티켓을 확인했거나 티켓이없는 경우 티켓을 만들었습니까? 합리적인 기능처럼 들리 겠지만 ...
kraftner

1
나는 실제로 문제를 이해하지 못한다. "이것은 권한이 두 지점 (하나는 여전히 적용되는 코어에서)과 필터에서 해결됨을 의미합니다. 이상적으로는 구성 수준, 즉 사용자 정의 게시물 유형이 정의 된 위치에 있습니다." 여기에서 무슨 뜻인지 분명히 알 수 있습니까? 내가 바보라면 미안해!
Jim Maguire

2
이 질문을 내리고 있습니다. 나는 왜 18 명이 그것을 찬성했는지 이해하지 못한다. 이해할 수 없습니다.
Jim Maguire

답변:


1

나는 소스를 살펴 보았고, 내가 볼 수 있듯이, 권한 변경에 활용할 수있는 후크 / 필터가 없습니다.

내 의도는 이것이 의도적 인 디자인 결정 이었다는 것입니다.

REST API는 확장 가능하도록 빌드되었지만 요청하는 방식으로 코어 엔드 포인트를 수정하지 않는 것이 좋습니다.

REST API 핸드북의이 섹션 에서 사용할 수있는 정보가 제한되어 있지만, API가 노후할수록 더 많은 코드 (핵심이든 제 3 자이든)가 사용 가능한 특정 조치와 표준 제공에 의존하기 시작합니다. 응답.

대신 사용자 지정 컨트롤러를 만들어야합니다.

rest_controller_class인수에register_post_type() 클래스 이름을 지정하여 맞춤 게시물 유형에 맞춤 컨트롤러를 지정할 수 있습니다 .

사용자 정의 컨트롤러의 작동 방식에 대한 개요는 REST API 핸드북 에서 찾을 수 있습니다 .

명심해야 할 WP_REST_Controller사항은 개정을 지원하는 게시물 유형에 대한 추상 클래스를 확장하는 사용자 정의 컨트롤러를 작성 하면 다수의 게시물 유형별 개정 엔드 포인트가 자동으로 작성된다는 것입니다.

WP_REST_Controller클래스를 확장하지 않으면 register_routes()메서드가 호출되지 않으므로 사용자 지정 경로를 수동으로 등록해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.