2013-12-11 5 views
10

मेरे Meteor.js एप्लिकेशन में, मैं व्यवस्थापक को जबरन उपयोगकर्ताओं को लॉग इन करने में सक्षम होना चाहता हूं।मैं Meteor.js में सर्वर से किसी उपयोगकर्ता को लॉग आउट कैसे कर सकता हूं?

उपयोग का मामला यह है कि मेरा एप्लिकेशन अंतिम उपयोगकर्ताओं की सेवा कर रहा है, और जब कोई सुपर-उपयोगकर्ता लॉग इन होता है तो सेवा खुली होती है। यदि कोई सुपर-उपयोगकर्ता स्पष्ट रूप से लॉग आउट करना भूल गया है, तो सेवा खुली प्रतीत होगी अंतिम उपयोगकर्ताओं के लिए। यदि कोई व्यवस्थापक इसे देखता है, तो उसे लॉग इन उपयोगकर्ता को जबरन लॉग आउट करने में सक्षम होना चाहिए, और इस तरह सेवा को अंतिम उपयोगकर्ताओं के लिए बंद कर देना चाहिए।

क्या यह Meteor.js के साथ संभव है? यदि हां, तो कैसे? क्या इस उपयोग के मामले में बेहतर/अन्य दृष्टिकोण हैं?

संपादित करें: @ अक्षत के लिए स्पष्टीकरण देने के लिए मैंने दूरस्थ रिमोट लॉगआउट के कुछ उदाहरण जोड़े हैं।

उदाहरण 1 (जो के रूप में मैं चाहता हूँ काम नहीं करता है):

एक लॉगआउट विधि में:

if (user.profile.role === ROLES.ADMIN) { 
      Meteor 
       .users 
       .update({ 
        _id: options.userId 
       }, 
       { 
        $set: { 
         'services.resume.loginTokens' : [] 
       }}); 
     } else { 
      throw new Meteor.Error(403, "You are not allowed to access this."); 
     } 

मेरी application.js में:

var lastUserId; 
Deps.autorun(function() { 
    if(Meteor.user()) { 
     if (Meteor.user().profile && Meteor.user().profile.firstName) { 
      console.log("USER LOGGED IN"); 
      console.log("LENGTH LOGINTOKENS", 
        Meteor 
         .user() 
         .services 
         .resume 
         .loginTokens.length); // This is always 1 
      lastUserId = Meteor.user()._id; 

      if (Meteor.user().services.resume.loginTokens.length === 0) { 
       // This never fires, and thus the client does not know until 
       // manually refreshed. Of course I could keep a forceLogOut-variable 
       // as done in the next example. 
       window.location.reload(); 
      } 
     } 
    } else { 
     console.log("SOMETHING CHANGED IN METEOR.USER"); 
     if (lastUserId) { 
      console.log("THE USER IS LOGGED OUT"); 
      Meteor.call('userLoggedOut', 
      { 
       userId: lastUserId 
      }); 
      lastUserId = null; 
     } 
    } 
}); 

उदाहरण 2 (यह काम करता है जैसा कि मैं चाहता हूं, क्लाइंट पक्ष पर Meteor.logout() के साथ केवल बल LogOut का उपयोग करते समय।):

लॉगआउट में विधि:

if (user.profile.role === ROLES.ADMIN) { 
      Meteor 
       .users 
       .update({ 
        _id: options.userId 
       }, 
       { 
        $set: { 
         'services.resume.loginTokens' : [], 
         'profile.forceLogOut': true 
       }}); 
     } else { 
      throw new Meteor.Error(403, "You are not allowed to access this."); 
     } 

मेरी application.js में:

var lastUserId; 
Deps.autorun(function() { 
    if(Meteor.user()) { 
     if (Meteor.user().profile && Meteor.user().profile.firstName) { 
      console.log("USER LOGGED IN"); 
      console.log("LENGTH LOGINTOKENS", 
        Meteor 
         .user() 
         .services 
         .resume 
         .loginTokens.length); // This is always 1 
      lastUserId = Meteor.user()._id; 

      if (Meteor.user().profile.forceLogOut) { 
       // Small example 1: 
       // When logintokens have been set to [], and forceLogOut 
       // is true, we need to reload the window to show the user 
       // he is logged out. 
       window.location.reload(); 
       // END Small example 1. 

       // Small example 2: 
       // When already keeping this variable, I might as well just use 
       // this variable for logging the user out, and no resetting of 
       // loginTokens are needed, or reloading the browser window. 
       // This seems to me as the best way. 
       console.log("FORCING LOGOUT"); 
       Meteor.logout(); 
       // END Small example 2. 

       // And finally resetting the variable 
       Meteor.call('resetForceLogOut', 
        { 
         userId: Meteor.user()._id 
        }); 
      } 
     } 
    } else { 
     console.log("SOMETHING CHANGED IN METEOR.USER"); 
     if (lastUserId) { 
      console.log("THE USER IS LOGGED OUT"); 
      Meteor.call('userLoggedOut', 
      { 
       userId: lastUserId 
      }); 
      lastUserId = null; 
     } 
    } 
}); 

उत्तर

22

आप डेटाबेस से सभी loginTokens को हटाना होगा। यह इस क्वेरी के साथ सभी उपयोगकर्ताओं के लिए करेगा। यदि आप उपयोगकर्ताओं के छोटे सबसेट को लॉग आउट करना चाहते हैं या वर्तमान उपयोगकर्ता को बाहर करना चाहते हैं तो आप चयनकर्ता को कस्टमाइज़ कर सकते हैं।

Meteor.users.update({}, {$set : { "services.resume.loginTokens" : [] }}, {multi:true}); 

योग्य कुछ बातें:

  • यह वर्तमान उपयोगकर्ता के प्रवेश सहित सभी उपयोगकर्ताओं लॉग आउट कर देगा।
  • यह केवल सर्वर साइड पर काम करता है
+0

मैं इस एक ही बार में की कोशिश करेंगे! जल्दी उत्तर देने के लिए धन्यवाद। क्या यह कहीं भी दस्तावेज है, बीटीडब्ल्यू? – user2602152

+2

मुझे नहीं लगता कि यह दस्तावेज है लेकिन उल्का लॉग इन करने वाले उपयोगकर्ताओं की पहचान करने के लिए 'loginTokens' के अंदर मानों का उपयोग करता है। इसलिए उनके बिना उपयोगकर्ता लॉग इन हैं क्योंकि सब कुछ प्रतिक्रियाशील है – Akshat

+0

कभी-कभी यह एक आकर्षण की तरह काम करता है, और उपयोगकर्ता दृश्य को फिर से प्रस्तुत किया जाता है और उपयोगकर्ता को लॉगिन पेज पर रीडायरेक्ट किया जाता है। लेकिन दूसरी बार उपयोगकर्ता "प्रतिबंधित क्षेत्र" के अंदर घूमने में सक्षम है। मुझे यह देखने के लिए उपयोगकर्ता को रीफ्रेश करना है कि यह लॉग आउट है। मैं इसे कैसे ठीक करूं? – user2602152

2

हर किसी के लिए लॉग बाहर लेकिन नहीं वर्तमान उपयोगकर्ता (आप):

Meteor.users.update({ 
    _id: { 
     $ne: Meteor.user()._id 
    } 
}, { 
    $set: { 
     "services.resume.loginTokens": [] 
    } 
}, { 
    multi: true 
}); 
संबंधित मुद्दे

 संबंधित मुद्दे