2013-06-28 2 views
14

ich hinzufügen Konten-Passwort und Konten-Basispakete in MeteorWie Benutzer die automatische Anmeldung nach erstellen verhindern

Wenn ich Benutzer wie folgt zu erstellen:

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 
      }  
    }); 

Konto erstellt wurde und der Benutzer angemeldet hat .

Ich logge mich zum Beispiel als Administrator ein und möchte ein Konto für jemanden erstellen, aber ich möchte mich nach dem Erstellen des Kontos nicht abmelden.

Wie kann die automatische Anmeldung nach dem Erstellen des Benutzers verhindert werden?

I Quellcode accouts-password Pakete finden:

48-63 Zeilen:

// 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 
    }); 
}; 

Soll ich den Quellcode ändern, dieses Problem zu lösen?

Jede Hilfe wird geschätzt.

Antwort

20

Sie versuchen, die clientseitige Kontenverwaltung zu verwenden, um eine Aufgabe auszuführen, für die sie nicht entwickelt wurde.

Das Ziel des Client-Side-Accounts-Pakets besteht darin, neuen Benutzern ausdrücklich zu ermöglichen, ihr Konto zu erstellen, und erwarten, dass sie sofort angemeldet sind.

Sie müssen daran denken, dass bestimmte Funktionen auf dem Client und/oder auf dem Server mit unterschiedlichem Verhalten ausgeführt werden können. "Accounts.createUser docs" gibt Folgendes an: "Auf dem Client meldet sich diese Funktion als neu erstellter Benutzer erfolgreich an Fertigstellung."

Im Gegensatz dazu "Auf dem Server gibt es die neu erstellte Benutzer-ID zurück." (Es ist nicht mit dem derzeit angemeldeten Benutzer auf dem Client unordentlich).

Um Ihr Problem zu lösen, sollten Sie eine serverseitige Methode schreiben, um einen neuen Benutzer zu erstellen und ihn von Ihrem clientseitigen Admin-Panel aus aufrufen zu können, nachdem Sie ein Benutzererstellungsformular Ihres eigenen Designs korrekt ausgefüllt haben.

+1

Vielen Dank! Ich bin so sorglos, dass ich die wichtige Erklärung vernachlässige. –

+0

ahhhhhhhhhhhhhhhhhhh danke das war ein toller Kommentar +1 –

1

Wenn Sie wirklich dieses Verhalten möchten Sie brauchen würde password_server.js

zu modifizieren und Linien 474-475 enthalten entfernen:

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

so dass der Benutzer nicht, nachdem der Benutzer angemeldet sein würde geschaffen.

0

Ich hatte das gleiche Problem. Ich wollte eine Admin-Oberfläche erstellen, in der ein Administrator das Passwort eines Benutzers festlegen, aber nicht an eine Server-Methode im Klartext übergeben kann. Die Client-Seite von Accounts.createUser beschäftigt sich bereits damit, also ändere ich einfach die normale Abfolge von Ereignissen in accounts-password/password-server.js in Anwesenheit eines Flags. Es ist nicht perfekt oder hübsch, aber scheint zu funktionieren und Sie müssen das accounts-password Paket nicht direkt ändern.

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

Gibt mir ein paar Fehler, kann Meteor.server.method_handlers.createUser nicht bekommen; – jetlej

0

Wenn Sie möchten, ohne sich der Benutzer bei der Verwendung Accounts.createUser auf dem Client, um fortzufahren. Sie können optional callbackMeteor.logout() von createUser ‚s nennen.

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

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