权限矩阵
+-------+---+----------+
|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
等),而不是执行发布查询“ snip”。当前解决方案(有效,但不理想)
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 楼
我已经浏览了源代码,从我的了解中可以看出,没有任何钩子/筛选器可用于更改权限。
我的理解是,这是一个有意的设计决定。
尽管REST API的构建是可扩展的,但不建议您按照自己的方式修改核心终结点。
有一些局限性REST API手册的此部分中提供了信息,但要点是,随着API的老化,更多代码(无论是核心还是第三方)将开始取决于可用的特定操作并提供标准响应。
您应该创建一个自定义控制器。
通过在
rest_controller_class
的register_post_type()
参数中指定一个类名,可以为自定义帖子类型提供自定义控制器。可在REST API手册中找到有关自定义控制器应如何工作的概述。
要记住的另一件事是,如果创建自定义控制器, ich为支持修订的帖子类型扩展了抽象
WP_REST_Controller
类,将自动创建许多特定于帖子类型的修订端点。如果不扩展
WP_REST_Controller
类,则不会调用register_routes()
方法因此您必须手动注册您的自定义路线。
评论
为什么要在全局范围内实例化Access?您是否需要其他地方?如果您回答“是”,则可能需要将其附加到过滤器。公平的问题-上面只是一个代码段,我正在使用composer和PSR4自动加载将类模块绘制到父App类中,上面的代码段位于其中-因此它实际上不是global global,而是将其命名为\应用和访问实际上是\ App \ Services \ Access
我自己尚未调查此问题,但是您是否检查过Trac的票证或是否创建了该票证?听起来很合理,具有...
我不太了解这个问题。 “这意味着权限将在两个位置(一个仍在应用中,在核心位置)和我的过滤器中进行解析。理想情况下,它将在配置级别上进行,即定义自定义帖子类型。”您能否在这里澄清您的意思?对不起,如果我很傻!
我正在拒绝这个问题。我不明白为什么有18个人对此表示反对。太不可思议了。