Tôi đang hướng tới việc hạn chế một số động từ RESTUL cho mỗi loại bài đăng tùy chỉnh. Ví dụ: được cung cấp loại bài đăng tùy chỉnh Từ vựng, tôi muốn nói:
Ma trận cho phép
+-------+---+----------+
|index | X | GET |
|show | O | GET |
|create | X | POST |
|update | X | PATCH/PUT|
|delete | X | DELETE |
+-------+---+----------+
V2 dường như không cung cấp mức độ kiểm soát đó. Tôi đã đi qua nguồn và từ những gì tôi có thể thấy, không có bất kỳ hook / bộ lọc nào để khai thác để thay đổi quyền.
Giải pháp hiện tại của tôi là như sau. Nó thỏa hiệp của một lớp nơi bạn có thể tải trong một ma trận các loại bài tùy chỉnh chống lại các hành động được phép. Điều này sau đó có thể được gọi trong rest_prepare_vocabulary
bộ lọc, phá hủy phản hồi nếu các quyền không xếp hàng.
Vấn đề
Tôi không cảm thấy đây là một giải pháp hợp lý. Điều đó có nghĩa là các quyền đang được giải quyết ở hai điểm (một, trong lõi, vì chúng vẫn được áp dụng) và trong các bộ lọc của tôi.
Lý tưởng nhất, nó sẽ ở mức cấu hình, cụ thể là nơi các loại bài đăng tùy chỉnh được xác định.
Nói cách khác, tôi muốn vượt qua trong các quy tắc (dọc theo dòng exclude_from_search
, publicly_queryable
, vv) chứ không phải là thực hiện một truy vấn bài "snip".
Giải pháp hiện tại (hoạt động nhưng không mong muốn)
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]);
}
}
Hàm.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
và truy cập thực sự\App\Services\Access
Access
trong phạm vi toàn cầu? Bạn có cần nó ở nơi khác không? Trong trường hợp bạn trả lời câu hỏi này bằng có , thay vào đó, bạn có thể muốn đính kèm nó vào bộ lọc.