创建用户后如何防止自动登录

Posted

技术标签:

【中文标题】创建用户后如何防止自动登录【英文标题】:How to prevent auto login after create user 【发布时间】:2013-06-25 22:49:57 【问题描述】:

我在Meteor中添加了accounts-password和accounts-base包

当我这样创建用户时:

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 文档指定:“在客户端,此功能在成功完成后以新创建的用户身份登录。”

相反,“在服务器上,它返回新创建的用户ID。” (它不会与客户端上当前登录的用户混淆)。

为了解决您的问题,您应该编写一个服务器端方法来创建一个新用户,并能够在正确填写您自己设计的用户创建表单后从您的客户端管理面板调用它。

【讨论】:

谢谢!我太粗心了,忽略了重要的解释。 ahhhhhhhhhhhhhhhhhhh 谢谢这是一个很棒的评论 +1【参考方案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);

        );
    );

【讨论】:

给我一些错误,无法获取 Meteor.server.method_handlers.createUser;【参考方案4】:

如果您想在不登录用户的情况下继续在客户端上使用Accounts.createUser。您可以从createUser 的optional callback 调用Meteor.logout()

Accounts.createUser(user, err => 
  if (err) 
    // handle error
    return;
  

  // Prevent unwanted login
  Meteor.logout();
);

【讨论】:

以上是关于创建用户后如何防止自动登录的主要内容,如果未能解决你的问题,请参考以下文章

如何防止 Firebase 中出现重复的用户属性?

如何防止在asp.net中注册用户重定向

如何防止 Firebase 一遍又一遍地创建同一个用户?

防止用户在注册firebase后自动登录[重复]

PayPal登录按钮,防止新窗口或自动关闭?

如何停止自动登录到aspnet中创建的帐户