我有護照庫節點應用。我用護照的策略是這樣的:護照 - 優先戰略動態
passport.use(someStrategy)
是否有可能重寫戰略以後動態?在應用程序運行期間,我想在某個時候使用不同的策略。實際上相同的策略,但具有不同的配置。
如果我再拍passport.use(someOtherStrategy),那麼不只是增加一個「中間件」到護照?然後,這不會刪除舊的,只需添加一個。我想要刪除舊的。因此,覆蓋或刪除並添加一個新的。
我有護照庫節點應用。我用護照的策略是這樣的:護照 - 優先戰略動態
passport.use(someStrategy)
是否有可能重寫戰略以後動態?在應用程序運行期間,我想在某個時候使用不同的策略。實際上相同的策略,但具有不同的配置。
如果我再拍passport.use(someOtherStrategy),那麼不只是增加一個「中間件」到護照?然後,這不會刪除舊的,只需添加一個。我想要刪除舊的。因此,覆蓋或刪除並添加一個新的。
在護照源代碼挖透露,壓倒一切很容易做到。 這裏是代碼的相關部分:
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方法刪除策略,如代碼中所示。
@米奇你的答案是有益的,但有點偏離主題。可能部分是因爲我並不是非常清楚,我正在尋找一種覆蓋現有策略的方法,而不僅僅是如何配置多個策略。對不起,我的問題描述中並沒有超清楚。
這是可能的護照即使配置相同類型的多個命名策略。下面我可以有不同的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問題可能會幫助您從堆棧中刪除中間件;其針對的表達/連接因此也應該在一定程度上適用於護照。