【问题标题】:How to redirect based on user role with PassportJS?如何使用 PassportJS 基于用户角色进行重定向?
【发布时间】:2020-12-31 08:54:21
【问题描述】:

我需要重定向 3 种类型的用户(基于单个用户模型架构)。如何在用户路由中的 router.post() 调用中执行此操作?我知道 passport.authenticate 接受某些参数,但我想知道是否有任何方法可以根据用户类型(架构中的角色)进行多个重定向?非常感谢! 这是我为一种类型的用户做的事情:

//////this is my passport.js file//////

const LocalStrategy = require('passport-local').Strategy;
const mongoose = require('mongoose');
const bcrypt = require('bcryptjs');

// Load User model
const User = require('../models/User');

module.exports = function(passport) {
  passport.use(
    new LocalStrategy({ usernameField: 'email' }, (email, password, done) => {
      // Match user
      User.findOne({
        email: email
      }).then(user => {
        if (!user) {
          return done(null, false, { message: 'That email is not registered' });
        }

        // Match password
        bcrypt.compare(password, user.password, (err, isMatch) => {
          if (err) throw err;
          if (isMatch) {
            return done(null, user);
          } else {
            return done(null, false, { message: 'Password incorrect' });
          }
        });
      });
    })
  );

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

  passport.deserializeUser(function(id, done) {
    User.findById(id, function(err, user) {
      done(err, user);
    });
  });
};



/////////auth.js file/////////
module.exports = {
  ensureAuthenticated: function(req, res, next) {
    if (req.isAuthenticated()) {
      return next();
    }
    req.flash('error_msg', 'Please log in to view that resource');
    res.redirect('/users/login');
  },
  forwardAuthenticated: function(req, res, next) {
    if (!req.isAuthenticated()) {
      return next();
    }      
  }
};


//////users.js route bellow/////////
const express = require('express');
const router = express.Router();
const bcrypt = require('bcryptjs');
const passport = require('passport');
// Load User model
const User = require('../models/User');
const { forwardAuthenticated } = require('../config/auth');
const mongoose = require('mongoose');
// Login Page
router.get('/login', forwardAuthenticated, (req, res) => res.render('login'));

// Register Page
router.get('/register', forwardAuthenticated, (req, res) => res.render('register'));

// Register
router.post('/register', (req, res) => {
  const { role, name, email, password, password2 } = req.body;
  let errors = [];

  if (!role || !name || !email || !password || !password2) {
    errors.push({ msg: 'Please enter all fields' });
  }

  if (password != password2) {
    errors.push({ msg: 'Passwords do not match' });
  }

  if (password.length < 6) {
    errors.push({ msg: 'Password must be at least 6 characters' });
  }

  if (errors.length > 0) {
    res.render('register', {
      errors,
      role,
      name,
      email,
      password,
      password2
    });
  } else {
    User.findOne({ email: email }).then(user => {
      if (user) {
        errors.push({ msg: 'Email already exists' });
        res.render('register', {
          errors,
          role: role,
          name,
          email,
          password,
          password2
        });
      } else {
        const newUser = new User({
          role,
          name,
          email,
          password
        });

        bcrypt.genSalt(10, (err, salt) => {
          bcrypt.hash(newUser.password, salt, (err, hash) => {
            if (err) throw err;
            newUser.password = hash;
            newUser
              .save()
              .then(user => {
                req.flash(
                  'success_msg',
                  'You are now registered and can log in'
                );
                res.redirect('/users/login');
              })
              .catch(err => console.log(err));
          });
        });
      }
    });
  }
});




 // Login
   router.post('/login', (req, res, next) => {
       passport.authenticate('local', {
        successRedirect: '/aboutus',
        failureRedirect: '/users/login',
        failureFlash: true
      })(req, res, next);
});



// Logout
router.get('/logout', (req, res) => {
  req.logout();
  req.flash('success_msg', 'You are logged out');
  res.redirect('/users/login');
});

module.exports = router;

【问题讨论】:

  • 我不完全确定您想要实现什么,但我了解您希望根据用户的角色重定向用户。我想一个简单的 switch / case 语句就可以完成这项工作。
  • 嗨 Sylvain,感谢您的评论。感谢您对我的问题的模棱两可的理解。可以肯定的是,您是说我应该将 router.post 调用包装在 switch / case 语句中吗?我不认为我可以在里面使用它。你能建议一个场景吗?谢谢!

标签: node.js reactjs mongodb passport.js


【解决方案1】:

我很确定在帖子中你可以做这样的事情:

app.post('/login', (req, res) => {
    if (req.body.role === 'normalUser') {
        res.redirect('/normalUserPage')
    } else if (req.body.role === 'administrator') {
        res.redirect('/administratorPage');
    } else if (req.body.role === 'receptionist') {
        res.redirect('/receptionistPage');
    }
});

我很确定应该这样做,确保这些条件是在尝试之后出现的 使用提供的电子邮件和密码登录。

您要做的就是为三个用户设置条件,然后根据用户类型将他们重定向到他们的特定页面。

另一种解决方案是使用提供的信息登录并显示相同的页面。但是,根据用户的角色,您可以指定他们正在查看的内容。

示例:

如果用户类型是 admin,则公开一个 div,允许他们查看所有数据并具有编辑或删除的能力。

如果用户是普通用户,则公开一个允许他们仅查看为他们指定的内容的 div。例如只有名称,没有任何其他信息。

如果用户是接待员,则公开一个允许他们查看所有内容但无法编辑任何信息的 div。

我真的希望这对你有帮助。让我知道这是否对您有帮助。 如果它对您没有帮助,我可以尝试找出另一种解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-01
    • 2016-01-17
    • 2018-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-14
    • 2021-09-17
    相关资源
    最近更新 更多