【问题标题】:Access denied [403] when updating user accounts client-side in Meteor在 Meteor 中更新用户帐户客户端时访问被拒绝 [403]
【发布时间】:2015-10-16 09:10:39
【问题描述】:

我正在阅读 Meteor here 和用户帐户包 here 的文档,但找不到答案。我已成功添加 useraccounts 包并创建了一些用户,但现在我想将一些数据添加到给定用户的集合中的记录中。

例如,在创建帐户和登录之后。我希望用户能够在他们的记录中添加/编辑一些字段(简短的传记等),但每当执行Meteor.users.update(..) 时,我都会收到 403 错误。

我的登录配置文件可以在here找到。

导致错误的代码:

Template.editProfile.events({
    'submit form': function(e) {
        e.preventDefault();

        var profileInfo = {
            displayName: $(e.target).find('[name=displayName]').val(),
            tagLine: $(e.target).find('[name=tagLine]').val(),
            aboutMe: $(e.target).find('[name=aboutMe]').val()
        };

        Meteor.users.update(
            { _id: Meteor.userId()},
            { $set: profileInfo},
            function (err) {
                if(err) {
                    console.log('there was an error submitting editProfile data');
                    console.log(err);
                } else {
                    Router.go('profile');
                }
            }
        );
    }
});

执行控制台日志显示Meteor.userId() 正确返回,所以我不确定问题出在哪里。我假设这是允许/拒绝的问题,但我什至不知道从哪里开始进行故障排除。

确切的错误是:

错误:403

errorType: "Meteor.Error"

消息:“访问被拒绝 [403]”

原因:“访问被拒绝”

【问题讨论】:

  • 我认为您需要对用户 mongo 集合执行 collection.allow({update: blahblah})。文档在这里:docs.meteor.com/#/full/allow
  • @matthias-eckhart ,我看到这个问题被编辑了一点,但想指出我是专门针对useraccounts-core package 提出这个问题的,它没有提到在任何地方设置allow()使用这个包时的客户端(我认为可能有一些我误解的可选配置)

标签: javascript meteor meteor-accounts


【解决方案1】:

通过删除insecure 包,默认情况下将拒绝客户端写入访问。 如果要允许客户端直接写入集合,则需要定义规则。

例如:

Meteor.users.allow({
    update: ownsDocument
});

ownsDocument = function (userId, doc) {
    return doc && doc.userId === userId;
};

ownsDocument() 函数检查指定的userId 是否拥有该文档。除了update回调,还可以设置insertremove的规则。

了解更多关于Meteor's collection.allow(options) 的信息,访问demo appclone the repository

【讨论】:

  • 问题是,我还没有删除不安全的包。我认为这是特定于 useraccounts 包的东西,或者可能是默认的流星“用户”集合。另外,我已经尝试过你在上面但它不起作用,尽管我同意在允许/拒绝规则期间必须有一些东西阻止它(也许是用户集合的一些挂钩设置?)
  • 很遗憾,我无法重现您的问题。我创建了一个微型应用程序来演示如何更改用户名。请查看我的更新答案。
  • 感谢您的帮助 :) 您的代码和我的代码之间的区别在于这一行 - $set: {'profile.name': username}。所以看起来profile字段是可以编辑的,但是我们不能直接动态添加到用户obj中?示例 - $set: {'myField': 'xxx'} 这是否记录在某处(也许我错过了)
  • 没错。如果您想向用户的文档添加字段,您应该使用Account.onCreateUser 服务器端挂钩。但是,用户可以使用profile 字段创建和更新任何数据。阅读有关Meteor.users 的更多信息。
  • 好了,重读一遍,现在理解多了。谢谢!
猜你喜欢
  • 1970-01-01
  • 2012-10-17
  • 1970-01-01
  • 1970-01-01
  • 2018-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多