在访问页面之前检查用户的“许可级别”

时间:2017-11-19 16:39:41

标签: javascript node.js

我是node.js的新手,所以我的问题很简单:

我的路由文件中有此功能,用于检查用户是否经过身份验证

function isLoggedIn(req, res, next) {
    if(req.isAuthenticated()){
        console.log(req.user);
        return next();
    }
    req.flash('warn_msg', 'Login required');
    res.redirect('back');
}

我需要的是一个类似的,也检查用户“清除级别”。

这是我写的:

function isLevel(clearance, req, res, next) {
    if(req.isAuthenticated()){
        if(req.user.level>=clearance){
            return next();
        }
        else {
            req.flash('warn_msg', 'Not enough permissions');
            res.redirect('back');
        }
    }
    else {
        req.flash('warn_msg', 'Login required');
        res.redirect('back');
    }
}

问题是我可以像这样使用的第一个

app.get('/newOrg', isLoggedIn, function(req, res) {
    res.render('Orgs/newOrg');
});

但我不知道如何将'clearance'参数传递给第二个,并将其称为

app.get('/newOrg', isLevel(3), function(req, res) {
    res.render('Orgs/newOrg');
});

给我一​​个错误,说'req'未定义

我知道我可以解决并检查get路径中的用户级别,但我想要一个“更清洁”的解决方案

2 个答案:

答案 0 :(得分:3)

当express加载路由时,它会查找应该引用函数的中间件。在这里你放isLevel(3),基本上调用函数并将函数的结果作为中间件。

您需要引用功能。你可以通过创建像这样的函数来做到这一点

function checkLevel3(req, res, next) {
  return isLevel(3, req, res, next);
}

然后使用checkLevel3代替isLevel(3)

您还可以创建一个高阶函数,可以根据需要吐出checkLevel3等函数

function leveler(n) {
  return (req, res, next) => isLeveL(n, req, res, next);
}
// now
const checkLevel3 = leveler(3);

答案 1 :(得分:0)

你不能运行这个功能,但你需要传递一个引用,所以express可以在需要的时候调用它。所以为了传递价值,你需要做两件事之一。

您可以为req添加新对象以供临时使用,或使用express-session在多个请求之间进行更“永久”的使用。在您的情况下,express-session看起来最好。

它看起来像这样

const session = require('express-session')

// Setup session management
app.use(session({
  secret: 'keyboard cat',
  resave: false,
  saveUninitialized: true
}))

// Set the session
app.get('/auth', (req, res) => {
    req.session.clearance = 3
    res.redirect('/newOrg')
})

// Run isLevel
app.get('/newOrg', isLevel, (req, res) => {

})

// Get the session
function isLevel(clearance, req, res, next) {
    console.log(req.session.clearance)
}