首页 > 解决方案 > 如何允许相同的用户名但不同的公司注册?

问题描述

在 Meteor 中,如何允许相同的用户名但不同的公司注册?

我想设置用户名唯一:假如何自定义帐户包?

accounts_server.js
users._ensureIndex('username', { unique: true, sparse: true });

标签: meteoraccount

解决方案


在您的系统中拥有唯一的用户名有充分的理由,尤其是完整性和验证。规避此功能可能会导致潜在风险,并且可能会破坏accounts软件包的稳定性,因为它们是围绕用户是唯一的假设而构建的usernameemail

您可以在源代码中看到,它Accounts.createUser正在检查唯一的用户名和电子邮件,独立于原始 Mongo 集合。

如果您仍然坚持要覆盖此行为(我强烈建议不要这样做),则需要手动执行所有操作(此处不包括验证):

import { Meteor } from 'meteor/meteor'

const createUser = ({ username, password, company }) => {
  if (Meteor.users.find({ username, company }).count() > 0) {
    throw new Error(`Account already exists for ${username}@${company}`)
  }

  const userId = Meteor.users.insert({ username, company })
  Accounts.setPassword(userId, password)
  return userId
}

Meteor.startup(() => {
  Meteor.users.rawCollection().dropIndex('username_1')
  Meteor.setTimeout(() => {
    createUser({ username: 'johndoe', password: 'password', company: 'Software Inc.' })
    createUser({ username: 'johndoe', password: 'password', company: 'Pro Software' })
  }, 1000)
})

通过这样做,您需要使用自己的实现覆盖所有 Accounts 方法(尤其是身份验证和登录)。但是,正如我所说 -最好不要这样做。

更好的解决方案:改用电子邮件

用户名公司名称的组合已经包含在电子邮件模式中。

因此,最简单的解决方案是实施基于 的帐户email,而不是基于username

const createUser = (email, password, company) => {
  const userId = Accounts.createUser({ email, password })
  Meteor.users.update(userId, { $set: { company }})
  return userId
}

推荐阅读