Với Rest V2 (WP4.7), làm thế nào để hạn chế một số động từ RESTFUL?


20

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_vocabularybộ 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;
};

1
Tại sao bạn khởi tạo Accesstrong 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 , thay vào đó, bạn có thể muốn đính kèm nó vào bộ lọc.
kaiser

3
Câu hỏi công bằng - Trên đây chỉ là một đoạn trích, tôi đang sử dụng trình soạn thảo và tự động tải PSR4 để vẽ các mô-đun lớp vào một lớp Ứng dụng mẹ, trong đó đoạn trích ở trên - vì vậy nó không thực sự là toàn cầu, nó sẽ được đặt tên \Appvà truy cập thực sự\App\Services\Access
Chris

1
Tôi đã không tự mình điều tra vấn đề này, nhưng bạn đã kiểm tra Trac để lấy vé hay đã tạo nếu nó không tồn tại? Âm thanh như một tính năng hợp lý để có ...
kraftner

1
Tôi không thực sự hiểu vấn đề. "Đ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 là ở cấp cấu hình, cụ thể là nơi xác định loại bài đăng tùy chỉnh." Bạn có thể làm rõ những gì bạn có ý nghĩa ở đây? Xin lỗi nếu tôi ngu ngốc!
Jim Maguire

2
Tôi đang hạ thấp câu hỏi này. Tôi không hiểu tại sao 18 người ủng hộ nó. Thật không thể hiểu nổi.
Jim Maguire

Câu trả lời:


1

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.

Hiểu biết của tôi là đây là một quyết định thiết kế có chủ ý.

Mặc dù API REST được xây dựng để có thể mở rộng, nhưng không nên sửa đổi các điểm cuối cốt lõi theo cách bạn đang yêu cầu.

Có một số thông tin hạn chế có sẵn trong phần này của cẩm nang API REST , nhưng ý chính của nó là khi API có tuổi, nhiều mã hơn (dù là lõi hay bên thứ ba) sẽ bắt đầu phụ thuộc vào các hành động cụ thể có sẵn và cung cấp tiêu chuẩn phản ứng.

Thay vào đó bạn nên tạo một bộ điều khiển tùy chỉnh.

Các loại bài tùy chỉnh có thể được cung cấp một bộ điều khiển tùy chỉnh bằng cách chỉ định một tên lớp trong rest_controller_classđối sốregister_post_type() .

Tổng quan về cách các bộ điều khiển tùy chỉnh nên hoạt động có thể được tìm thấy trong sổ tay API REST .

Một điều khác cần lưu ý là nếu bạn tạo một bộ điều khiển tùy chỉnh mở rộng WP_REST_Controllerlớp trừu tượng cho một loại bài đăng hỗ trợ sửa đổi, một số điểm cuối sửa đổi cụ thể của loại bài đăng sẽ được tạo tự động.

Nếu nó không mở rộng WP_REST_Controllerlớp, register_routes()phương thức không được gọi vì vậy bạn sẽ phải đăng ký thủ công các tuyến tùy chỉnh của mình.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.