【问题标题】:Support for multiple user types by Passport-local mongoose node.jsPassport-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());

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

【问题讨论】:

    标签: node.js mongodb authentication passport.js passport-local


    【解决方案1】:

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

    1. 创建了两个 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');
      });
    
    1. 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);
            }
        
            });
        

        【讨论】:

          猜你喜欢
          • 2021-08-15
          • 2018-12-13
          • 2023-03-30
          • 2018-11-07
          • 2016-01-30
          • 1970-01-01
          • 2013-07-23
          • 2014-10-22
          • 2017-05-14
          相关资源
          最近更新 更多