在 PassportJS 中使用多种本地策略

2024-06-06

我正在尝试在 PassportJS 中使用多种本地策略。我不想使用本地、facebook 和 gmail 等。 我有两组用户存储在单独的对象中,我想使用本地策略来对这两组用户进行身份验证。就目前情况而言,我无法对两者使用相同的本地策略,因为它们具有不同的对象属性,这让我查询不同的对象。有什么办法可以做到这一点吗?或者对此有任何建议将不胜感激。


You can name您将它们分开的本地策略。

// use two LocalStrategies, registered under user and sponsor names

      // add other strategies for more authentication flexibility
  passport.use('user-local', new LocalStrategy({
      usernameField: 'email',
      passwordField: 'password' // this is the virtual field on the model
    },
    function(email, password, done) {
      User.findOne({
        email: email
      }, function(err, user) {
        if (err) return done(err);

        if (!user) {
          return done(null, false, {
            message: 'This email is not registered.'
          });
        }
        if (!user.authenticate(password)) {
          return done(null, false, {
            message: 'This password is not correct.'
          });
        }
        return done(null, user);
      });
    }
  ));

    // add other strategies for more authentication flexibility
    passport.use('sponsor-local', new LocalStrategy({
            usernameField: 'username',
            passwordField: 'password' // this is the virtual field on the model
        },
        function(username, password, done) {
            Sponsor.findOne({
                'primaryContact.username': username
            }, function(err, sponsor) {
                if (err) return done(err);

                if (!sponsor) {
                    return done(null, false, {
                        message: 'This email/username is not registered.'
                    });
                }
                if (!sponsor.authenticate(password)) {
                    return done(null, false, {
                        message: 'This password is not correct.'
                    });
                }
                return done(null, sponsor);
            });
        }
    ));

后面的控制器代码通过名称引用它们。

/**
 * User Login
 */
exports.loginUser = function (req, res, next) {
    passport.authenticate('user-local', function(err, user, info) {
        var error = err || info;
        if (error) return res.json(401, error);

        req.logIn(user, function(err) {

            if (err) return res.send(err);
            res.json(req.user.userInfo);
        });
    })(req, res, next);
};

/**
 * Sponsor Login
 */
exports.loginSponsor = function (req, res, next) {
    passport.authenticate('sponsor-local', function(err, sponsor, info) {
        var error = err || info;
        if (error) return res.json(401, error);

        req.logIn(sponsor, function(err) {
            if (err) return res.send(err);
            res.json(req.sponsor.profile);
        });
    })(req, res, next);
};

稍后,当需要序列化您的用户时,您可能想做这样的事情。

// serialize
passport.serializeUser(function(user, done) {            
  if (isUser(user)) {
    // serialize user
  } else if (isSponsor(user)) {
    // serialize company
  }
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 PassportJS 中使用多种本地策略 的相关文章

随机推荐

  • 如何防止或阻止关闭 WinForms 窗口?

    如何通过显示来防止窗口关闭MessageBox 技术 WinForms with C 当关闭事件发生时 我希望运行以下代码 private void addFile FormClosing object sender FormClosing
  • C# 中的带 FileSystemWatcher 的 Windows 服务

    我必须创建一个程序来监视文件大小的变化 我已经制作了一个简单的 Windows 服务和文件系统观察器 所以我现在熟悉这个概念 我还制作了一个检查文件大小的代码 在表单按钮中制作 但尚未在我的文件系统观察器中实现 如何创建具有监视文件大小的文
  • 使用 C++ 命令行的简单计算器

    我正在编写一个项目 我们从命令行进行简单的计算器 用户按此格式输入程序名firstNumber 运算符secondNumber 到目前为止我得到的是 include
  • EJB:无接口的依赖注入

    我有这个代码 Local interface IRepo Stateless class Repo implements IRepo class WebS EJB private IRepo repo 并且一切正常 但现在我删除了界面IRe
  • 奇怪的 Java 泛型

    这是什么意思 HashBiMap
  • 如何从应用程序中删除额外的本机依赖项?

    我在我的应用程序中使用 arcgis 它捆绑了很大的本机依赖项 如果包含 x86 依赖项意味着减少 apk 的大小 我不想包含它 如何告诉 gradle 自动排除 x86 本机库 我尝试在构建过程中手动删除它 但重建后又出现了 如何告诉 g
  • 更新 iOS 应用程序的应用内购买内容?

    我似乎无法在任何地方找到这个问题的答案 所以这里 我正在开发一个 iOS 应用程序 该应用程序将具有非消耗性应用内购买 扩展包 例如 假设我出售一个包含 10 个级别的包 并且在一个月内我想将应用内购买更新为包含 15 个级别 用户无需重新
  • 将海龟模块与 tkinter 画布集成[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我正在尝试将 Turtle 模块集成到我用 TKInter 创建的界面中 目前我有一个画布 我希望乌龟可以在其中绘制 参
  • 如何为 glDrawElements() 指定每个图元的颜色

    我想渲染一个索引几何体 所以 我有一堆顶点和关联的排序索引 我在用glDrawElements 渲染 2 个四边形 如下所示 现在 我知道我可以使用glColorPointer 用于指定每个顶点的颜色 我的问题是 我可以指定吗每个基元的颜色
  • PHP如何计算时差? [复制]

    这个问题在这里已经有答案了 我必须计算日期时间差 如何在 PHP 中做到这一点 我需要准确的小时 分钟和秒 有人有这方面的脚本吗 Use the diff 方法 http www php net manual en datetime dif
  • 如何在 next.js 中使用 window.matchMedia 和样式组件主题?

    我有一个主题 const smartPhonePortrait 320 const theme isCompact typeof window undefined window matchMedia min width smartPhone
  • 从txt文件java中删除一行[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个大文件 我只需要删除其中的几行 有没有办法在不打开新文件并复制整个文本的情况下执行此操作 编辑 主要问题是当它在多个带有大 t
  • Resharper 中的警告“未使用纯方法的返回值”

    我有一个关于我正在工作的 c 项目中从 Visual Studio 中的 Resharper 收到的警告的快速问题 警告是 不使用纯方法的返回值 发生这种情况的方法如下 private static bool FilePathHasInva
  • 如何获取文件的 ctime、atime、mtime 并更改它们

    如何使用 Go 获取文件的 ctime mtime atime 并更改它们 在 Go 1 1 2 中 os Stat只能获取mtime os Chtimes 可以更改 mtime 和 atime 但不能更改 ctime Linux ctim
  • 使用JavaBeans的地方?

    什么是 JavaBean 为什么需要它 既然我可以使用类和接口结构创建所有应用程序 为什么我需要豆子 您能给我举一些例子 说明 bean 比类和接口更重要吗 请在以下上下文中解释 Bean 的重要性 Wep apps 独立应用程序 它们通常
  • .NET Regex Negative Lookahead - 我做错了什么?

    假设我有 StartTest NoInclude EndTest StartTest Include EndTest 并正在使用 StartTest NoInclude s S EndTest g 为什么我要匹配这两个组 正则表达式示例 h
  • 从 CardView Click 上的 FireBase 数据库检索节点 ID

    我有一个在 Android 上使用的 firebase 数据库 为了从 Firebase 检索和显示数据 我使用 FirebaseRecyclerAdapter 并将结果显示到 CardView 现在我正在将所需表中的所有列表获取到 Car
  • 转发 UIAlertView 的可变参数

    我正在尝试设置一个非常简单的UIAlertView带有文本编辑 确定和取消按钮 我想根据文本编辑的内容禁用确定按钮 为了能够保留委托 以便他不会在警报视图之前消失 从而在用户对警报视图执行某些操作时立即导致崩溃 我对其进行了子类化 现在 我
  • 我可以在 WebGL 的 GLSL 中使用什么作为数组索引?

    是否只允许使用常量 或者我可以将其用于循环索引或任何其他动态值 In WebGL GLES2 是的 只允许使用常量 但是 如果您的代码可以展开 无论是由您自己还是由编译器 那么它就被视为一个常量 并且您有一个解决方法 例如 问题 unifo
  • 在 PassportJS 中使用多种本地策略

    我正在尝试在 PassportJS 中使用多种本地策略 我不想使用本地 facebook 和 gmail 等 我有两组用户存储在单独的对象中 我想使用本地策略来对这两组用户进行身份验证 就目前情况而言 我无法对两者使用相同的本地策略 因为它