Passport - 动态覆盖策略

时间:2017-08-28 07:15:19

标签: javascript node.js passport.js

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

passport.use(someStrategy)

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

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

2 个答案:

答案 0 :(得分:4)

挖掘护照源代码显示,可以轻松完成覆盖。 以下是代码的相关部分:

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列表中的另一个策略使用,那么它将被新策略取代。也可以使用方法不使用方法删除策略,如代码中所示。

@Mitch你的答案很有帮助,但很少偏离主题。可能部分是因为我并不是非常清楚我正在寻找一种覆盖现有策略的方法,而不仅仅是如何配置多种策略。对不起,我在问题描述中并不是很清楚。

答案 1 :(得分:1)

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

例如:

ul

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

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

使用上述方法,您可以配置多种策略,并根据条件决定使用哪种策略:

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

或者:

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

从中间件堆栈中删除策略有点棘手,没有内置功能可以做到这一点我不会想到。它可能涉及手动将策略拼接出堆栈。 This问题可能有助于您从堆栈中删除中间件;它的目标是快递/连接所以也应该在一定程度上适用于护照。