使用定制REST端点和主干进行访问检查

时间:2020-10-01 作者:dsj

我在中创建了一个带有多个自定义REST端点的插件。但是,我无法获得工作的权限回调。当前用户始终为“0”。我正在使用本地化脚本发送nonce。

        wp_localize_script( $this->cloud_base, \'POST_SUBMITTER\', array(
        \'root\' => esc_url_raw( rest_url() ),
        \'nonce\' => wp_create_nonce( \'wp_rest\' ),
        \'success\' => __( \'Data Has been updated!\', \'your-text-domain\' ),
        \'failure\' => __( \'Your submission could not be processed.\', \'your-text-domain\' ),
        \'current_user_id\' => get_current_user_id()
        )
    ); 
然后在javascript代码中,我修改了sync函数以返回nonce:

    app.Model = Backbone.Model.extend({
// over ride the sync function to include the Wordpress nonce.  
    sync: function( method, model, options ){
        return Backbone.sync(method, this, jQuery.extend( options, {
            beforeSend: function (xhr) {
            alert(POST_SUBMITTER.nonce);  // nonce is shown here. 
            xhr.setRequestHeader( \'X-WP-NONCE\', POST_SUBMITTER.nonce );
            },
        } ));   
    },  
});
主干用于对来自REST端点的项目列表进行常规化,并生成用于添加或更新的表单。(如果禁用访问检查,一切正常。)

在我的访问检查中,当前用户始终为0

    public function cloud_base_members_access_check(){  
    if (  current_user_can( \'read\' )) {
        return true;
    }
    return new \\WP_Error( \'rest_forbidden\', esc_html__( \'Sorry, you are not authorized for that.\', \'my-text-domain\' ), array( \'status\' => 401 ) );
}   
Wordpress REST手册中的接缝表明这应该是可行的。我结合了几个不同示例中的元素,试图实现这一点,但我还没有找到如何使这一切协同工作的示例。我已经试着让这项工作进行了大约一周了,现在我已经没有主意了?关于如何做到这一点,有什么建议吗?

1 个回复
SO网友:dsj

问题是我超越了脊梁骨。仅在主干中同步方法。模型当主干网获取初始数据(GET)时,它使用主干网中的同步方法。集合。所以我需要覆盖主干中的同步。集合:

app.Collection = Backbone.Collection.extend({   
    sync: function( method, model, options ){
        return Backbone.sync(method, this, jQuery.extend( options, {
            beforeSend: function (xhr) {
            xhr.setRequestHeader( \'X-WP-NONCE\', POST_SUBMITTER.nonce );
            },
        } ));   
    },  
 }) ; 
这样,nonce将与GET请求以及POST、PUT和DELETE一起发送。

您可能可以覆盖主干。同步,从而同时覆盖模型和集合。