2017-08-28 58 views
5

我有護照庫節點應用。我用護照的策略是這樣的:護照 - 優先戰略動態

passport.use(someStrategy) 

是否有可能重寫戰略以後動態?在應用程序運行期間,我想在某個時候使用不同的策略。實際上相同的策略,但具有不同的配置。

如果我再拍passport.use(someOtherStrategy),那麼不只是增加一個「中間件」到護照?然後,這不會刪除舊的,只需添加一個。我想要刪除舊的。因此,覆蓋或刪除並添加一個新的。

回答

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列表中的其他策略的名稱,然後它被替換由新戰略。也可以使用unuse方法刪除策略,如代碼中所示。

@米奇你的答案是有益的,但有點偏離主題。可能部分是因爲我並不是非常清楚,我正在尋找一種覆蓋現有策略的方法,而不僅僅是如何配置多個策略。對不起,我的問題描述中並沒有超清楚。

0

這是可能的護照即使配置相同類型的多個命名策略。下面我可以有不同的configs 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問題可能會幫助您從堆棧中刪除中間件;其針對的表達/連接因此也應該在一定程度上適用於護照。