Javascript Passport动态覆盖策略
我有一个带有passport库的节点应用程序。我使用的passport策略如下:Javascript Passport动态覆盖策略,javascript,node.js,passport.js,Javascript,Node.js,Passport.js,我有一个带有passport库的节点应用程序。我使用的passport策略如下: passport.use(someStrategy) 以后是否可以动态地覆盖该策略?在应用程序运行期间,我希望在某个时候使用不同的策略。实际上是相同的策略,但配置不同 如果我只是制作另一个passport.use(someOtherStrategy),那么这不就是在passport中添加另一个“中间件”吗?这样就不会删除旧的,只需再添加一个。我想把旧的删除掉。因此,要么重写,要么删除并添加一个新策略。可以在pas
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删除策略,如代码中所示
@米奇:你的回答很有帮助,但有点离题。可能部分是因为我不太清楚我在寻找一种方法来覆盖现有的策略,而不仅仅是如何配置多个策略。对不起,我的问题描述不太清楚