Passport-local mongoose node.js 支持多种用户类型

Posted

技术标签:

【中文标题】Passport-local mongoose node.js 支持多种用户类型【英文标题】:Support for multiple user types by Passport-local mongoose node.js 【发布时间】:2018-07-27 14:59:44 【问题描述】:

我想要两种类型的用户登录(用户,客户)。如何在我的 app.js 中为这两种类型创建 localStrategies、序列化和反序列化用户 我有两个独立的架构,都使用 PassportLocalMongoose 插件。

我目前正在配置我的护照,如下所示,

var User = require('./models/User');
var Client= require('./models/Client');
passport.use(new LocalStrategy(User.authenticate(), Client.authenticate()));
passport.serializeUser(User.serializeUser(), Client.serializeUser());
passport.deserializeUser(User.deserializeUser(), Client.deserializeUser());

问题出在我尝试注册时。注册为用户有效,但作为客户端显示“未经授权”错误。 我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

在浏览了 passport.js 的文档(对 Jared 表示敬意)之后,我明白我做的几乎所有事情都错了。

    创建了两个 localStrategies

    passport.use('userLocal', new LocalStrategy(User.authenticate())); passport.use('clientLocal', new LocalStrategy(Client.authenticate()));

并进行身份验证,

passport.authenticate('userLocal')(req, res, function () 
    res.redirect('/profile');
  );
and
passport.authenticate('clientLocal')(req, res, function () 
    res.redirect('/client');
  );

    serializeUser 和 deseriealizeUser 使用了 passport 模块(l=不使用 passport-local-mongoose 模块)。

    passport.serializeUser(function(user, done) done(null, user); );

    passport.deserializeUser(function(user, done) if(user!=null) done(null,user); );

整个用户架构(对象)现在存储在请求中,可以通过您的任何路由访问。

希望它能帮助遇到类似问题的其他人。

【讨论】:

【参考方案2】:

您可以在猫鼬模式中创建角色并将其提供给用户或客户端。根据角色您可以进行身份​​验证

【讨论】:

【参考方案3】:

您需要创建两个策略并编辑您的序列化和反序列化函数以支持多种格式 当您调用 authenticate() 时,您可以指定 startegy 名称

例如 在中间件中

exports.authenticateUserA = function (req, res, next) 
    console.log('authenticateA', req.body.hostname)
    passport.authenticate('loginA', failureRedirect: '/login-fail',successRedirect: "/home", function (err, player, info) )

在passport-config.js中

  passport.serializeUser(function (user, done) 
     console.log('deserialize user ')
     if (typeof user.mac_address == 'undefined') 

      user.data_type = 'userTypeA'
      done(null, user);
      else
        user.data_type = 'userTypeB'
        done(null, user);
    

    );

【讨论】:

以上是关于Passport-local mongoose node.js 支持多种用户类型的主要内容,如果未能解决你的问题,请参考以下文章

设置 Mongoose 模式进行身份验证后,如何使用 Mongodb 查询数据库?

如何在 Mongoose 中更新/更新文档/数据? Passport MongoDB、Express、AngularJS、Nodejs

本地护照和本地护照猫鼬的身份验证错误

“passport”、“passport-local”和“passport-jwt”有啥区别? [关闭]

带有 Passport-Local 和 deSerializeUser 问题的简单身份验证

讨论:本地存储中 Passport-local JWT Token 的关注