Как предотвратить автоматический вход в систему после создания пользователя - программирование
Подтвердить что ты не робот

Как предотвратить автоматический вход в систему после создания пользователя

Я добавляю пакеты учетных записей и учетных записей в 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
  });
};

Должен ли я изменить исходный код для решения этой проблемы?

Любая помощь приветствуется.

4b9b3361

Ответ 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();
});