1

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

有两种用户:

  1. 普通用户(他们使用/user-login页面和护照策略登录'local-user-login';普通用户存储在“用户”MongoDB 集合中)
  2. 管理员(他们使用/admin-login页面和护照策略登录'local-admin-login';管理员存储在“管理员”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
});

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

4

2 回答 2

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

然后在路线中:

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);
于 2015-02-26T14:17:41.330 回答
1

在会话对象存储角色信息

在路由配置级别,编写中间件,如

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

用户路线相同

于 2015-02-26T13:30:32.400 回答