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