Answers:
当我们使用注册一条休息路线时register_rest_route()
,则可以使用permission_callback
具有所需权限类型的参数。
检查例如如何WP_REST_Posts_Controller::register_routes()
和WP_REST_Users_Controller::register_routes()
执行权限回调。
您所指的password参数是内容的密码,您可以为每个帖子设置该密码,并且该密码是不相同的。
但是由于您要定位现有路线,例如:
/wp/v2/cards
/wp/v2/cards/(?P<id>[\d]+)
/wp/v2/cards/...possibly some other patterns...
您可以尝试使用rest_dispatch_request
过滤器(例如,过滤器)为此类路由设置其他权限检查。
这是一个演示插件:
add_filter( 'rest_dispatch_request', function( $dispatch_result, $request, $route, $hndlr )
{
$target_base = '/wp/v2/cards'; // Edit to your needs
$pattern1 = untrailingslashit( $target_base ); // e.g. /wp/v2/cards
$pattern2 = trailingslashit( $target_base ); // e.g. /wp/v2/cards/
// Target only /wp/v2/cards and /wp/v2/cards/*
if( $pattern1 !== $route && $pattern2 !== substr( $route, 0, strlen( $pattern2 ) ) )
return $dispatch_result;
// Additional permission check
if( is_user_logged_in() ) // or e.g. current_user_can( 'manage_options' )
return $dispatch_result;
// Target GET method
if( WP_REST_Server::READABLE !== $request->get_method() )
return $dispatch_result;
return new \WP_Error(
'rest_forbidden',
esc_html__( 'Sorry, you are not allowed to do that.', 'wpse' ),
[ 'status' => 403 ]
);
}, 10, 4 );
我们以/wp/v2/cards
和/wp/v2/cards/*
GET路由为目标,并进行了其他用户权限检查。
使用WordPress Cookie身份验证进行调试时,我们可以例如使用以下命令直接对其进行测试:
https://example.tld/wp-json/wp/v2/cards?_wpnonce=9467a0bf9c
随机数部分是从哪里生成的 wp_create_nonce( 'wp_rest' );
希望这可以帮助!
register_post_type_args
过滤器和e(例如,$args['show_in_rest'] = is_user_logged_in();
为给定帖子类型或基于设置)来删除给定自定义帖子类型的端点$args['rest_base']
。不知道这是想要的还是推荐的;-)
您看到的“密码”字段实际上不是用于REST API,而是用于Post条目本身。WordPress中的各个帖子都可以使用密码保护,因此您需要密码才能查看其内容。
这种形式的个人后密码不是强大的密码机制,它是共享密码。密码对于所有用户都是相同的,并且未加密和未加密地存储在数据库中。绝不打算以任何方式将其用作安全机制,它是一种以简单方式隐藏内容的简单机制。
如果要将这种机制与REST API一起使用,则可以实现。例如,如果单个帖子的ID为123,则可以像这样检索帖子:
http://example.com/wp-json/wp/v2/posts/123
如果该帖子受密码保护,则此URL将检索它:
http://example.com/wp-json/wp/v2/posts/123?password=example-pass
参考:https : //developer.wordpress.org/rest-api/reference/posts/#retrieve-a-post
如果您需要更强大的基于用户的身份验证,则WordPress提供了一种使帖子“私有”的方法。此设置使帖子仅对具有“ read_private_posts”功能的用户帐户可见,该功能默认情况下仅限于管理员和编辑者角色。(注意:“私人”仅将帖子内容设为私人,其标题仍可以公开。)
当您创建自定义帖子类型时,相同的功能会映射到您类型的复数形式(使用plural_base)。因此,对于帖子类型的卡片,如果需要,可以使用类似的“ read_private_cards”权限分配给用户角色。
现在,用户级别的身份验证实际上并未内置在REST API中。基于标准WordPress cookie的身份验证工作正常,但是API无法提供获取该cookie的方法。如果存在它,它将接受它,但是您必须执行常规的登录流程才能获得这样的cookie。如果您需要其他身份验证方法,则需要一个插件。
存在四个这样的插件。这些是OAuth 1.0,应用程序密码,JSON Web令牌和基本身份验证插件。请注意,基本身份验证最简单,但是它也不安全,因此仅建议用于测试和开发目的。不应在实时生产服务器上使用它。
您可以在此处找到有关这些插件的更多信息:
https://developer.wordpress.org/rest-api/using-the-rest-api/authentication/#authentication-plugins