रेस्ट 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ग्लोबल स्कोप में इंस्टेंट क्यों किया ? क्या आपको इसकी आवश्यकता कहीं और है? यदि आप इसका जवाब हां में देते हैं, तो आप इसे एक फ़िल्टर के बजाय संलग्न करना चाह सकते हैं।
kaiser

3
उचित सवाल - ऊपर सिर्फ एक स्निपेट है, मैं संगीतकार और PSR4 ऑटोलोडिंग का उपयोग कर रहा हूं ताकि माता-पिता ऐप क्लास में क्लास मॉड्यूल खींच सकें, जिनमें से उपरोक्त स्निपेट में होगा - इसलिए यह वास्तव में वैश्विक वैश्विक नहीं है, इसे नाम दिया जाएगा \Appऔर पहुंच वास्तव में है\App\Services\Access
क्रिस

1
मैंने स्वयं इस समस्या की जाँच नहीं की है, लेकिन क्या आपने एक टिकट के लिए Trac की जाँच की या यदि यह मौजूद नहीं है तो एक बनाया है? एक उचित सुविधा की तरह लगता है ...
kraftner

1
मैं वास्तव में समस्या को नहीं समझता। "इसका मतलब है कि अनुमतियाँ दो स्थानों में हल हो रही हैं (एक, कोर में, जैसा कि वे अभी भी लागू हैं) और मेरे फिल्टर में। आदर्श रूप से, यह एक कॉन्फ़िगरेशन स्तर पर होगा, जहां कस्टम पोस्ट प्रकार परिभाषित किए गए हैं।" क्या आप संभवतः स्पष्ट कर सकते हैं कि आपके यहाँ क्या मतलब है? क्षमा करें अगर मैं बेवकूफ हूँ!
जिम मगुइरे

2
मैं इस सवाल को नीचा दिखा रहा हूं। मुझे समझ नहीं आता कि 18 लोगों ने इसे क्यों उखाड़ा। यह समझ के बाहर है।
जिम मगुइरे

जवाबों:


1

मैं स्रोत के माध्यम से चला गया हूं, और मैं जो देख सकता हूं, उसे बदलने की अनुमति में टैप करने के लिए कोई हुक / फिल्टर नहीं हैं।

मेरी समझ यह है कि यह एक जानबूझकर डिजाइन निर्णय था।

जबकि REST API को एक्स्टेंसिबल बनाने के लिए बनाया गया था, यह कोर एंडपॉइंट्स को उस तरह से संशोधित करने के लिए अनुशंसित नहीं है जिस तरह से आप पूछ रहे हैं।

REST API हैंडबुक के इस भाग में कुछ सीमित जानकारी उपलब्ध है , लेकिन इसका सार यह है कि API उम्र के रूप में, अधिक कोड (चाहे वह कोर या थर्ड पार्टी हो) उपलब्ध होने और मानक प्रदान करने वाली विशिष्ट क्रियाओं पर निर्भर होने लगेगा प्रतिक्रियाओं।

इसके बजाय आपको एक कस्टम नियंत्रक बनाना चाहिए।

rest_controller_classतर्कregister_post_type() में वर्ग नाम निर्दिष्ट करके कस्टम पोस्ट प्रकारों को एक कस्टम नियंत्रक दिया जा सकता है

कस्टम नियंत्रकों को कैसे काम करना चाहिए, इसका अवलोकन REST API हैंडबुक में पाया जा सकता है ।

ध्यान रखने योग्य कुछ और बात यह है कि यदि आप एक कस्टम कंट्रोलर बनाते हैं जो अमूर्त WP_REST_Controllerवर्ग को एक पोस्ट प्रकार के लिए विस्तारित करता है जो संशोधन का समर्थन करता है, तो कई प्रकार के पोस्ट रिवीजन समापन बिंदु स्वचालित रूप से बनाए जाएंगे।

यदि यह WP_REST_Controllerवर्ग का विस्तार नहीं करता है , तो register_routes()विधि को कॉल नहीं किया जाता है, इसलिए आपको अपने कस्टम मार्गों को मैन्युअल रूप से पंजीकृत करना होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.