Как предотвратить автоматический вход в систему после создания пользователя
Я добавляю пакеты учетных записей и учетных записей в Meteor
Когда я создаю пользователя следующим образом:
Accounts.createUser({username: username, password : password}, function(err){
if (err) {
// Inform the user that account creation failed
console.log("Register Fail!")
console.log(err)
} else {
console.log("Register Success!")
// Account has been created and the user has logged
}
});
Учетная запись создана и пользователь зарегистрировался.
например, я регистрируюсь как администратор, и я хочу создать учетную запись для кого-то, но я не хочу выходить из системы после создания учетной записи.
Как предотвратить автоматический вход в систему после создания пользователя?
Я нахожу исходный код пакетов accouts-password:
48 - 63 строки:
// Attempt to log in as a new user.
Accounts.createUser = function (options, callback) {
options = _.clone(options); // we'll be modifying options
if (!options.password)
throw new Error("Must set options.password");
var verifier = Meteor._srp.generateVerifier(options.password);
// strip old password, replacing with the verifier object
delete options.password;
options.srp = verifier;
Accounts.callLoginMethod({
methodName: 'createUser',
methodArguments: [options],
userCallback: callback
});
};
Должен ли я изменить исходный код для решения этой проблемы?
Любая помощь приветствуется.
Ответы
Ответ 1
Вы пытаетесь использовать управление учетными записями на стороне клиента для выполнения задачи, для которой она не была разработана.
Цель пакета клиентских учетных записей - специально разрешить новым пользователям создавать свою учетную запись и ожидать, что она будет немедленно зарегистрирована.
Вы должны помнить, что определенные функции могут выполняться на клиенте и/или на сервере с различным поведением, в документах Accounts.createUser указано, что: "На клиенте эта функция регистрируется как вновь созданный пользователь при успешном завершении."
Напротив, "На сервере он возвращает вновь созданный идентификатор пользователя". (он не путается с текущим пользователем на клиенте).
Чтобы решить вашу проблему, вы должны написать метод на стороне сервера, создающий нового пользователя, и сможете вызвать его со своей панели администратора на стороне клиента, после правильного заполнения формы создания пользователя вашего собственного дизайна.
Ответ 2
Если вы действительно хотите этого поведения, вам нужно будет изменить password_server.js
и удалите строки 474-475, содержащие:
// client gets logged in as the new user afterwards.
this.setUserId(result.id);
Таким образом, пользователь не войдет в систему после создания пользователя.
Ответ 3
У меня была та же проблема. Я хотел создать интерфейс администратора, где администратор может установить пароль пользователя, но не передать его методу сервера в текстовом виде. Клиентская сторона Accounts.createUser уже имеет дело с этим, поэтому я просто изменяю обычную последовательность событий в accounts-password/password-server.js
при наличии флага. Это не идеально или красиво, но, похоже, работает, и вам не нужно напрямую изменять пакет accounts-password
.
Meteor.startup(function ()
{
// store the default createUser method handler
var default_create_user = Meteor.server.method_handlers.createUser;
// remove it so we can register our own
delete Meteor.server.method_handlers.createUser;
Meteor.methods({createUser: function (options) {
var default_login_method = Accounts._loginMethod;
// check if noAutoLogin flag is present
if (options.noAutoLogin)
{
// temporarily disable the login method while creating our user
// NB: it might be possible that simultaneous calls to createUser that do want the default behavior
// would use the altered Accounts._loginMethod instead
Accounts._loginMethod = function(s, m, a, p, fn)
{
// this is the callback that is constructed with a closure of the options array and calls internal create functions
fn();
// restore default _loginMethod so other calls are not affected
Accounts._loginMethod = default_login_method;
}
}
// invoke the default create user now that the login behavior has been short-circuited
default_create_user(options);
}});
});
Ответ 4
Если вы хотите продолжить использование Accounts.createUser
на клиенте без входа пользователя в систему. Вы можете вызвать Meteor.logout()
из createUser
необязательный обратный вызов.
Accounts.createUser(user, err => {
if (err) {
// handle error
return;
}
// Prevent unwanted login
Meteor.logout();
});