2017-08-28 18 views
5

मेरे पास पासपोर्ट लाइब्रेरी के साथ एक नोड एप्लिकेशन है। मैं इस तरह पासपोर्ट रणनीति का उपयोग करता हूं:पासपोर्ट - ओवरराइड रणनीति गतिशील रूप से

passport.use(someStrategy) 

क्या बाद में उस रणनीति को गतिशील रूप से ओवरराइड करना संभव है? आवेदन चलाने के दौरान, मैं किसी बिंदु पर एक अलग रणनीति का उपयोग करना चाहता हूं। असल में एक ही रणनीति, लेकिन एक अलग विन्यास के साथ।

अगर मैं सिर्फ एक और पासपोर्ट.यूज (कुछ अन्य स्ट्रेटेजी) बना देता हूं, तो क्या यह सिर्फ पासपोर्ट में एक और 'मिडलवेयर' नहीं जोड़ता है? फिर वह पुराना नहीं हटाएगा, बस एक और जोड़ें। मैं चाहता हूं कि पुराना एक हटा दिया जाए। तो या तो ओवरराइड करें, या हटाएं और एक नया जोड़ें।

उत्तर

0

पासपोर्ट स्रोत कोड में खुदाई से पता चला कि ओवरराइडिंग आसानी से किया जा सकता है।

Authenticator.prototype.use = function(name, strategy) { 
    if (!strategy) { 
    strategy = name; 
    name = strategy.name; 
    } 
    if (!name) { throw new Error('Authentication strategies must have a name'); } 

    this._strategies[name] = strategy; 
    return this; 
}; 
... 
... 
Authenticator.prototype.unuse = function(name) { 
    delete this._strategies[name]; 
    return this; 
}; 

के रूप में कोड से देखा जा सकता, रणनीति है कि आप का उपयोग एक नाम है कि पहले से ही _strategies सूची में एक रणनीति के द्वारा प्रयोग किया गया है, तो यह बदल जाएगी: यहाँ कोड के प्रासंगिक हिस्सा है नई रणनीति से। कोड में उल्लिखित विधि के साथ-साथ कोई भी विधि दुरुपयोग के साथ रणनीति को हटा सकता है।

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

0

पासपोर्ट में कई नामांकित रणनीतियों को कॉन्फ़िगर करना संभव है, यहां तक ​​कि उसी प्रकार के भी। नीचे मैं अलग कॉन्फ़िगरेशन के साथ myStrategy के दो उदाहरणों, लेकिन अलग-अलग नाम,

उदाहरण के लिए हो सकता है:

passport.use('someStrategy', new myStrategy(options)) 
passport.use('anotherStrategy', new myStrategy(differentOptions)); 

फिर बाद में, जब के सत्यापन आप जो रणनीति का उपयोग करने के लिए निर्दिष्ट कर सकते हैं:

passport.authenticate('someStrategy', ...); 

उपरोक्त का उपयोग करके, आप कई रणनीतियों को कॉन्फ़िगर कर सकते हैं, और एक सशर्त पर आधारित, तय कर सकते हैं कि कौन सी रणनीति का उपयोग करना है:

if (condition){ 
    passport.authenticate('someStrategy', ...); 
} 
else{ 
    passport.authenticate('anotherStrategy', ...); 
} 

या:

let strategyToUse = determineStrategy(); //dynamically choose which strategy you want 
passport.authenticate(strategyToUse, ...); 

मिडलवेयर ढेर से रणनीति हटाया जा रहा है एक छोटे से जटिल काम है और वहाँ यह करने के लिए मुझे नहीं लगता कि कोई इनबिल्ट सुविधा नहीं होती। इसमें मैन्युअल रूप से स्टैक से बाहर रणनीति को विभाजित करना शामिल हो सकता है। This प्रश्न आपको स्टैक से मिडलवेयर हटाने में मदद कर सकता है; इसका लक्ष्य व्यक्त/कनेक्ट करने के उद्देश्य से कुछ हद तक पासपोर्ट पर भी लागू होना चाहिए।

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