我正在使用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')));
有人可以帮我解决这个问题吗?