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

时间:2015-02-26 11:20:15

标签: node.js express mongoose passport.js passport-local

我正在使用Express / Node.js和Passport.js(本地护照)&猫鼬。

有两种用户:

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

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

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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);

用户路线相同