如何使用passportjs将经过身份验证的用户对象添加到会话中

时间:2014-10-18 06:50:29

标签: node.js session authentication express passport.js

我正在使用PassportJS对用户进行身份验证,它可以正常工作。 我想限制其访问级别,所以我尝试了mongoose-role

以下是我的mongoose-role模块的用户架构:

var userSchema = mongoose.Schema({
   ip: String,
   local: {
           email: String,
           password     : String
   },
   name: String ,
   created: { type: Date, default: Date.now },
}).plugin(require('mongoose-role'), {
  roles: ['public', 'user', 'admin'],
  accessLevels: {
    'public': ['public', 'user', 'admin'],
    'anon': ['public'],
    'user': ['user', 'admin'],
    'admin': ['admin']
  }
});

我使用以下代码进行用户使用local策略登录:

passport.use('local-login', new LocalStrategy({
        usernameField : 'email',
        passwordField : 'password',
        passReqToCallback : true 
    },
    function(req, email, password, done) { 
        User.findOne({ 'local.email' :  email }, function(err, user) {

            if (err)
                return done(err);

            if (!user)
                return done(null, false, req.flash('loginMessage', 'No user found.')); 

            if (!user.validPassword(password))
                return done(null, false, req.flash('loginMessage', 'Wrong password.'));
            return done(null, user);
        });
    }));

然后我有以下路由处理用户signin并在成功通过验证后显示其配置文件:

app.post('/login', passport.authenticate('local-login', {
    successRedirect: '/profile',
    failureRedirect: '/login', 
    failureFlash: true 
}));

app.get('/profile', [ hasAccess('admin'), function (req, res, next) {
    res.render('profile', {
        user: req.user 
    });
}]);

最后,我有以下中间检查用户是否有权访问特定级别:

function hasAccess(accessLevel) {
    return function (req, res, next) {

        console.log(req.session.user); // gives 'undefined'

        if (req.session.user && req.session.user.hasAccess(accessLevel)) {
            return next();
        }
        return res.json({
            success: false,
            error: 'Unauthorized'
        });
    }
}

但是console.log(req.session.user);给了我未定义的。这应该是怎么回事?我应该从session对象中获取req对象吗?如果是,那么我应该怎样做才能让我的用户在认证之后添加到会话对象中,以便我可以在给定浏览器的任何选项卡上访问它?

我的应用中有以下中间件:

app.use(favicon());
app.use(logger('dev'));
app.use(cookieParser());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));    
app.use(session({ secret: "adshlqr3kqwefsadjklqrwefdsbzcjxcq4rewfadshj" }));
app.use(passport.initialize());
app.use(passport.session());
app.use(flash()); 
app.use(express.static(path.join(__dirname, 'public')));

有人可以帮我解决这个问题吗?

0 个答案:

没有答案