Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Passport local mongoose node.js支持多种用户类型_Node.js_Mongodb_Authentication_Passport.js_Passport Local - Fatal编程技术网

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

Passport local mongoose node.js支持多种用户类型,node.js,mongodb,authentication,passport.js,passport-local,Node.js,Mongodb,Authentication,Passport.js,Passport Local,我需要两种类型的用户登录(用户、客户端)。我如何在我的app.js中为这两种类型创建localStrategies、序列化和反序列化用户 我有两个单独的模式,都使用PassportLocalMongoose插件 我目前正在配置我的护照,如下所示 var User = require('./models/User'); var Client= require('./models/Client'); passport.use(new LocalStrategy(User.authenticate()

我需要两种类型的用户登录(用户、客户端)。我如何在我的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());
问题在于我试图注册时。以用户身份注册是可行的,但作为客户端会显示“未经授权”错误。
如何解决这个问题?

在查看了passport.js(Jared很荣幸)的文档后,我明白我几乎做了所有错事

  • 创建了两个本地策略

    passport.use('userLocal',新的LocalStrategy(User.authenticate());
    使用('clientLocal',新的LocalStrategy(Client.authenticate())

  • 以及验证

    passport.authenticate('userLocal')(req, res, function () {
        res.redirect('/profile');
      });
    and
    passport.authenticate('clientLocal')(req, res, function () {
        res.redirect('/client');
      });
    
  • 已将passport模块(l=未使用passport本地mongoose模块)用于序列化用户和反序列化用户

    passport.serializeUser(函数(用户,完成){
    完成(空,用户);
    });

    passport.deserializeUser(函数(user,done){
    如果(用户!=null)
    完成(空,用户);
    });

  • 整个用户模式(对象)现在存储在请求中,可以通过任何路由访问


    希望它能帮助其他人解决类似问题。

    您可以在mongoose模式中扮演角色,并将其交给用户或客户端。根据您可以执行身份验证的角色,您需要创建两种策略,并编辑序列化和反序列化功能以支持多种格式 调用authenticate()时,可以指定startegy name

    比如说 在中间件中

    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);
        }
    
        });