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

Roc*_*CTZ 1 mongoose node.js express passport-local passport.js

我正在使用Express/Node.js和Passport.js(本地护照)和Mongoose构建应用程序.

有两种用户:

  1. 普通用户(他们使用/user-login页面和护照策略登录'local-user-login';常规用户存储在"用户"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');
}
Run Code Online (Sandbox Code Playgroud)

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

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

app.get('/admin_home', isLoggedIn, function(req, res) {
    // render the page
});
Run Code Online (Sandbox Code Playgroud)

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

zay*_*tro 5

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');
}
Run Code Online (Sandbox Code Playgroud)

然后在路线:

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);
Run Code Online (Sandbox Code Playgroud)