如何防止整个用户模型泄漏到玉石模板中

时间:2014-06-01 02:44:22

标签: javascript node.js express mongoose passport.js

我目前正在处理项目的登录部分,但我正在使用express,本地护照和猫鼬。我有一套路线:

module.exports = function (app) {
    app.get('/', function (req, res) {
        res.render('index', { user : req.user, title : "Home" });
    });

    app.get('/register', function(req, res) {
        res.render('register', { });
    });

    app.post('/register', function(req, res) {
            Athlete.register(new Athlete({
            username: req.param('username'),
            firstName: req.param('firstName'),
            lastName: req.param('lastName'),
            dob: req.param('dob')
        }), req.param('password'), function(err, athlete) {
            if (err) {
                console.log(err);
                return res.render('register');
            }    
            res.redirect('/');
        });
    });

    app.get('/login', function(req, res) {
        res.render('login', { user : req.user.username });
    });

    app.post('/login', passport.authenticate('local'), function(req, res) {
        res.redirect('/');
    });

    app.get('/logout', function(req, res) {
        req.session.destroy(function (err) {
            res.redirect('/');
        });
    });};

我目前能够登录并注销没有问题,并使用p= user.firstName jade语法按照jade模板显示我的名字。这虽然打乱了一个包含salt,hash以及模型值的对象。这显然是一个巨大的安全问题,我想知道路线和模板之间发生的事情。如何防止整个用户数据库对象出现以及我的代码的哪一部分导致错误传达。

1 个答案:

答案 0 :(得分:0)

首先,您的用户对象不会泄漏,因为在您的模板中公开秘密信息之前,将在服务器端呈现jade。因此传递额外信息不会导致泄漏。

如果你想限制整个用户传入jade,你可以在用户模式中添加一个方法,并在使用res.render时调用该方法。

userSchema.methods.getSafeUser = function() {
   var user = this;
   //filter user as per your requirements here.

   return user;

}

然后在您的控制器中,使用

res.render('index', { user : req.user.getSafeUser() });