Passport - 动态覆盖策略

Vil*_*oja 7 javascript node.js passport.js

我有一个带护照库的节点应用程序.我使用这样的护照策略:

passport.use(someStrategy)
Run Code Online (Sandbox Code Playgroud)

以后可以动态地覆盖该策略吗?在应用程序运行期间,我希望在某些时候使用不同的策略.实际上是相同的策略,但具有不同的配置.

如果我只是制作另一本护照.使用(someOtherStrategy),那么这只是为护照添加另一个"中间件"吗?然后那不会删除旧的,只需再添加一个.我希望删除旧的.因此,要么覆盖,要么删除并添加新的.

小智 5

可以在护照中配置多个命名策略,即使是同一类型。下面我可以有两个具有不同配置但命名不同的 myStrategy 实例,

例如:

passport.use('someStrategy', new myStrategy(options))
passport.use('anotherStrategy', new myStrategy(differentOptions));
Run Code Online (Sandbox Code Playgroud)

然后,在进行身份验证时,您可以指定要使用的策略:

passport.authenticate('someStrategy', ...);
Run Code Online (Sandbox Code Playgroud)

使用上面的内容,您可以配置多个策略,并根据条件决定使用哪个策略:

if (condition){
    passport.authenticate('someStrategy', ...);
}
else{
    passport.authenticate('anotherStrategy', ...);
}
Run Code Online (Sandbox Code Playgroud)

或者:

let strategyToUse = determineStrategy(); //dynamically choose which strategy you want
passport.authenticate(strategyToUse, ...);
Run Code Online (Sandbox Code Playgroud)

从中间件堆栈中删除策略有点棘手,而且我认为没有内置函数可以做到这一点。它可能涉及手动将策略从堆栈中拼接出来。 这个问题可能会帮助您从堆栈中删除中间件;它的目标是快速/连接,因此在某种程度上也适用于护照。


Vil*_*oja 5

挖掘护照源代码显示,可以轻松地进行覆盖。这是代码的相关部分:

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;
};
Run Code Online (Sandbox Code Playgroud)

从代码中可以看出,如果您使用的策略的名称已经被_strategies列表中的另一个策略使用,那么它将被新策略替换。也可以删除未使用方法的策略,如代码所示。

@Mitch您的回答是有帮助的,但很少有话题。可能部分原因是因为我不太清楚自己正在寻找一种方法来覆盖现有策略,而不仅仅是如何配置多个策略。抱歉,我的问题描述不太清楚。