如何在 Passport.js 中定义多个 isAuthenticated 函数?

How can you define multiple isAuthenticated functions in Passport.js?

我正在使用 Express/Node.js 和 Passport.js(passport-local) & Mongoose 构建一个应用程序。

有两种用户:

  1. 普通用户(他们使用 /user-login 页面和通行证策略 'local-user-login' 登录;普通用户存储在 "Users" MongoDB 集合中)
  2. 管理员(他们使用 /admin-login 页面和通行证策略 'local-admin-login' 登录;管理员存储在 "Admins" MongoDB 集合中)

我还有 2 个页面:/user_home(需要 登录的普通用户才能访问)和 /admin_home仅登录管理员)

/user_home的路线:

app.get('/user_home', isLoggedIn, function(req, res) {
    // render the page
});

function isLoggedIn(req, res, next) {
    if (req.isAuthenticated())
        return next();
    res.redirect('/login');
}

如果我以管理员身份登录并尝试访问 /user_home,它不允许我,这很好。我的问题是:如何定义另一个“isLoggedIn”函数来检查我是否以管理员身份而不是普通用户身份登录?理想情况下,我想要一个函数 "isLoggedInAsUser" 和另一个函数 "isLoggedInAsAdmin".

到目前为止,我尝试以相同的方式定义 /admin_home 路由:

app.get('/admin_home', isLoggedIn, function(req, res) {
    // render the page
});

但很明显为什么它不起作用。代码不知道我想让它检查它是否是管理员而不是普通用户。

在会话对象中存储角色信息

在路由配置层,像

这样写中间件
    var adminRoutes = express.routes();

    adminRoutes.route('/admin/*', function (req, res,next)
    {

    if(req.session.role==='Admin')

    return next();

   else
   {
   res.send("Authorization Error")
   }


    }
    app.use(adminRoutes);

用户路由相同

Passport 在 req.user 中存储经过身份验证的用户。所以你可以这样写中间件函数:

function allowAdmins(req, res, next) {
  if (req.user.role === 'Admin') return next();
  res.redirect('/user-login');
}

function allowRegular(req, res, next) {
  if (req.user.role === 'Regular') return next();
  res.redirect('/admin-login');
}

然后在路线中:

var userRouter = express.Router();

userRouter.use(isLoggedIn);
// Only authenticated users are allowed
userRouter.get('/home', isRegular, function (req, res) {});
userRouter.get('/admin', isAdmin, function (req, res) {});

app.use('/user', userRouter);