Javascript Passport动态覆盖策略

Javascript Passport动态覆盖策略,javascript,node.js,passport.js,Javascript,Node.js,Passport.js,我有一个带有passport库的节点应用程序。我使用的passport策略如下: passport.use(someStrategy) 以后是否可以动态地覆盖该策略?在应用程序运行期间,我希望在某个时候使用不同的策略。实际上是相同的策略,但配置不同 如果我只是制作另一个passport.use(someOtherStrategy),那么这不就是在passport中添加另一个“中间件”吗?这样就不会删除旧的,只需再添加一个。我想把旧的删除掉。因此,要么重写,要么删除并添加一个新策略。可以在pas

我有一个带有passport库的节点应用程序。我使用的passport策略如下:

passport.use(someStrategy)
以后是否可以动态地覆盖该策略?在应用程序运行期间,我希望在某个时候使用不同的策略。实际上是相同的策略,但配置不同


如果我只是制作另一个passport.use(someOtherStrategy),那么这不就是在passport中添加另一个“中间件”吗?这样就不会删除旧的,只需再添加一个。我想把旧的删除掉。因此,要么重写,要么删除并添加一个新策略。

可以在passport中配置多个命名策略,即使是相同类型的策略。下面我可以有两个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', ...);
}
使用上述方法,您可以配置多个策略,并根据条件决定使用哪种策略:

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

从中间件堆栈中删除策略有点棘手,而且我认为没有内置函数来完成这项工作。它可能涉及手动将策略从堆栈中剪接出来。
这个问题可能会帮助您从堆栈中删除中间件;它的目标是express/connect,所以在某种程度上也应该适用于passport。

深入研究passport源代码发现,重写操作很容易完成。 以下是守则的相关部分:

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删除策略,如代码中所示

@米奇:你的回答很有帮助,但有点离题。可能部分是因为我不太清楚我在寻找一种方法来覆盖现有的策略,而不仅仅是如何配置多个策略。对不起,我的问题描述不太清楚