Support for multiple user types by Passport-local mongoose node.js

痴心易碎 提交于 2019-11-30 00:34:11

问题


I wanted two types of users logging in (User, Client). How exactly can I create localStrategies, serialize and deserialize user for both types in my app.js I have two separate schemas, both using the PassportLocalMongoose plugin.

I currently configuraing my passport like below,

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

The problem lies when I try to register. Registering as a User works, but as a client shows "Unauthorized" error. How can I fix this problem?


回答1:


After going through the documentation of passport.js (kudos to Jared), I understood that I was doing almost everything wrong.

  1. Created two localStrategies

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

and to authenticate,

passport.authenticate('userLocal')(req, res, function () {
    res.redirect('/profile');
  });
and
passport.authenticate('clientLocal')(req, res, function () {
    res.redirect('/client');
  });
  1. Used passport module (l=not using the passport-local-mongoose module) for serializeUser and deseriealizeUser.

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

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

The whole user schema (object) is now stored in the request and can be accessed through any of your routes.

Hope it helps out others with a similar issue.




回答2:


You can make role in mongoose schema and give it to user or client. Based on the role you can do the authentication




回答3:


you need to create two strategy and edit your serialize and deserialize function for support multiple formats When you call authenticate() you can specify startegy name

for example In middleware

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

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

    });


来源:https://stackoverflow.com/questions/48831211/support-for-multiple-user-types-by-passport-local-mongoose-node-js

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!