ด้วย Rest V2 (WP4.7) วิธีใดที่จะ จำกัด กริยา RESTFUL ที่แน่นอน


20

ฉันตั้งใจที่จะ จำกัด คำกริยา RESTUL ต่อประเภทโพสต์ที่กำหนดเอง ตัวอย่างเช่นเนื่องจากโพสต์ประเภทคำศัพท์ที่กำหนดเองฉันอยากจะบอกว่า:

เมทริกซ์การอนุญาต

+-------+---+----------+
|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ในขอบเขตทั่วโลก? คุณต้องการที่อื่นไหม? ในกรณีที่คุณตอบคำถามด้วยใช่คุณอาจต้องการแนบกับตัวกรองแทน
ไกเซอร์

3
คำถามที่เป็นธรรม - ข้างต้นเป็นเพียงตัวอย่างข้อมูลฉันใช้นักแต่งเพลงและการโหลดอัตโนมัติ PSR4 เพื่อวาดโมดูลคลาสลงในคลาสแอพแม่ซึ่งตัวอย่างโค้ดข้างต้นจะอยู่ใน - ดังนั้นจึงไม่ใช่ทั่วโลกจริงมันจะถูกตั้งชื่อ\Appและ การเข้าถึงเป็นจริง\App\Services\Access
Chris

1
ฉันยังไม่ได้ตรวจสอบปัญหานี้ด้วยตัวเอง แต่คุณได้ตรวจสอบ Trac สำหรับตั๋วหรือสร้างขึ้นหากไม่มีหรือไม่ ฟังดูเหมือนเป็นคุณสมบัติที่สมเหตุสมผลที่จะมี ...
kraftner

1
ฉันไม่เข้าใจปัญหาจริงๆ "มันหมายถึงสิทธิ์ได้รับการแก้ไขในสองจุด (หนึ่งในแกนตามที่พวกเขายังคงใช้) และในตัวกรองของฉันนึกคิดมันจะอยู่ในระดับการกำหนดค่ากล่าวคือที่กำหนดประเภทโพสต์ที่กำหนดเอง" คุณสามารถอธิบายสิ่งที่คุณหมายถึงที่นี่ได้หรือไม่? ขออภัยถ้าฉันโง่!
จิมแมกไกวร์

2
ฉันกำลังลงคะแนนคำถามนี้ ฉันไม่เข้าใจว่าทำไม 18 คนโหวตขึ้น มันเข้าใจยาก
จิมแมกไกวร์

คำตอบ:


1

ฉันผ่านแหล่งที่มาและจากสิ่งที่ฉันเห็นไม่มีตะขอ / ตัวกรองใด ๆ ให้แตะเพื่อเปลี่ยนการอนุญาต

ความเข้าใจของฉันคือว่านี่เป็นการตัดสินใจออกแบบโดยเจตนา

ในขณะที่ REST API ถูกสร้างขึ้นเพื่อให้สามารถขยายได้ แต่ก็ไม่แนะนำให้แก้ไขจุดปลายแกนในแบบที่คุณต้องการ

มีข้อมูลที่ จำกัด อยู่ในส่วนนี้ของคู่มือ REST APIแต่ส่วนสำคัญของมันคือเมื่ออายุ API รหัสเพิ่มเติม (ไม่ว่าจะเป็นแกนหรือบุคคลที่สาม) จะเริ่มขึ้นอยู่กับการกระทำที่เฉพาะเจาะจงและมาตรฐาน การตอบสนอง

คุณควรสร้างคอนโทรลเลอร์ที่กำหนดเองแทน

ประเภทโพสต์ที่กำหนดเองสามารถได้รับตัวควบคุมที่กำหนดเองโดยการระบุชื่อคลาสใน rest_controller_classregister_post_type()อาร์กิวเมนต์

ภาพรวมของวิธีการทำงานของตัวควบคุมที่กำหนดเองสามารถพบได้ใน หนังสือคู่มือ REST API

สิ่งอื่นที่ต้องจำคือถ้าคุณสร้างตัวควบคุมแบบกำหนดเองซึ่งขยายนามธรรม WP_REST_Controllerคลาสสำหรับชนิดโพสต์ที่รองรับการแก้ไขจำนวนจุดสิ้นสุดการแก้ไขเฉพาะของประเภทโพสต์จะถูกสร้างขึ้นโดยอัตโนมัติ

ถ้ามันไม่ขยายWP_REST_Controllerชั้นเรียนregister_routes()วิธีการจะไม่ถูกเรียกดังนั้นคุณจะต้องลงทะเบียนเส้นทางที่กำหนดเองของคุณด้วยตนเอง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.