2013-06-28 71 views
14

我添加帳戶,密碼和帳戶 - 基礎包中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 
    }); 
}; 

我應該修改源代碼來解決這個問題呢?

任何幫助表示讚賞。

回答

20

您正在嘗試使用客戶端帳戶管理來執行未設計的任務。

客戶端帳戶包的目的是明確允許新用戶創建他們的帳戶,並期望立即登錄。

您必須記住某些函數可以在客戶端和/或具有不同行爲的服務器上運行,Accounts.createUser docs指定:「在客戶端上,此函數以新創建的用戶成功登錄完成「。

相反,「在服務器上,它返回新創建的用戶標識。」 (它不會混淆客戶端上當前登錄的用戶)。

爲了解決你的問題,你應該寫一個服務器端的方法創建一個新用戶,並能夠從您的客戶端管理面板調用它,正確填寫自己設計的用戶創建表單後。

+1

謝謝!我很粗心,忽略了重要的解釋。 –

+0

ahhhhhhhhhhhhhhhhhhh謝謝這是一個很棒的評論+1 –

1

如果你真的想這樣的行爲,你將需要修改password_server.js

和刪除線474-475包含:

// client gets logged in as the new user afterwards. 
this.setUserId(result.id); 

這樣用戶就不會在創建用戶後登錄。

0

我有同樣的問題。我想創建一個管理界面,管理員可以設置用戶的密碼,但不能以明文形式將其傳遞給服務器方法。 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); 

     }}); 
    }); 
+0

給了我一些錯誤,無法得到Meteor.server.method_handlers.createUser; – jetlej

0

如果您希望繼續使用在客戶端上Accounts.createUser,不登錄用戶,您還可以從createUseroptional callbackMeteor.logout()

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

    // Prevent unwanted login 
    Meteor.logout(); 
}); 
相關問題