如果您有管理员权限,是否可以在 Meteor 中设置其他用户的密码?

Is it possible to set another user's password in Meteor if you have admin privileges?

我现在正在尝试在 Meteor 管理页面中设置另一个用户的密码。

这是我的代码。

Meteor.methods({
  updateUserPassword: function(userId, password) {
    var loggedInUser = Meteor.user()

    if (!loggedInUser ||
        !(Roles.userIsInRole(loggedInUser, ['admin'], 'default_group')) || (loggedInUser._id == userId) ) {
      throw new Meteor.Error(403, "Access denied")
    }

    return Accounts.setPassword(userId, password);
  }
});

但是当我 运行 这段代码时,我得到 Accounts.setPassword is undefined 错误。

我添加了 accounts-password 和 accounts-base 包,但它仍然显示未定义的错误,所以我怀疑是否不再支持 Accounts.setPassword。

请帮我解决这个问题!

Accounts.setPasswordMeteor 中的 服务器专用 函数。如果您在浏览器控制台中收到错误,那是因为您的 updateUserPassword 方法是在 lib/ 文件夹或类似的地方声明的,并且可以被 客户端 和服务器端。

通常,希望在 lib/ 文件夹中声明 Meteor.methods 以便利用 Meteor 的 Latency Compensation 技术(也称为方法模拟)。

在你的情况下,这是不可取的,因为 Accounts.setPasswordserver-only.


解决方案一:

您可以使用Meteor.isClientMeteor.isServer来确定哪个代码到运行哪里。 (您也可以使用 this.isSimulation)。

Meteor.methods({
  updateUserPassword: function(userId, password) {
    var loggedInUser = Meteor.user()

    if (!loggedInUser ||
        !(Roles.userIsInRole(loggedInUser, ['admin'], 'default_group')) || (loggedInUser._id == userId) ) {
      throw new Meteor.Error(403, "Access denied")
    }

    if(Meteor.isServer) {
        return Accounts.setPassword(userId, password);
    } else if(Meteor.isClient) {
        // do something else
    }
  }
});

方案二:

您可以在服务器端声明 Meteor.methods,方法是将文件放在仅限服务器的 server/ 文件夹中,或者将整个 Meteor.methods 声明放在 if(Meteor.isServer) { ... }检查。

当不需要延迟补偿时应该使用它。