我使用 Passport.js
与 MongoStore
进行身份验证,我使用 express
作为网络框架。一旦用户登录,他就可以访问某条路线上的内容。
我想提供不同的内容,具体取决于哪个用户已通过身份验证。假设在members
的Mongo集合中,每个集合都有一个 category
或 privileges
属性,基于此我将调整为什么向他展示。
我将使用 AngularJS
来绑定和呈现HTML。
这是我管理的路线:
app.get('/',function (request, response) {
if(request.isAuthenticated())
response.redirect('/admin')
else
response.sendfile("public/index.html")
})
app.get('/admin',function (request, response) {
if(request.isAuthenticated())
response.sendfile("views/admin.html")
else
response.redirect('/')
})
app.post('/login',
passport.authenticate('local', {
successRedirect: '/admin',
failureRedirect: '/'
})
)
app.get('/logout', function (request, response){
request.session.destroy(function (err) {
response.redirect('/'); //Inside a callback… bulletproof!
})
})
app.get('*',function (request, response) {
response.redirect('/')
})
这是我的
Passport.js
代码:
mongoose.connect('mongodb://localhost/integraDB')
var Schema = mongoose.Schema
var userCredential = new Schema({
username: String,
password: String
}, {
collection: 'members'
})
var userCredentials = mongoose.model('members', userCredential)
app.use(session({
clear_interval: 900,
cookie: { maxAge: 2 * 60 * 60 * 1000 },
store: new MongoStore({
db : mongoose.connection.db
})
}));
passport.serializeUser(function(user, done) {
done(null, user);
})
passport.deserializeUser(function(user, done) {
done(null, user);
})
passport.use(new LocalStrategy(function(username, password, done) {
process.nextTick(function() {
userCredentials.findOne({
'username': username,
}, function(err, user) {
if (err) {
return done(err);
}
if (!user) {
return done(null, false);
}
if (user.password != password) {
return done(null, false);
}
return done(null, user);
});
});
}))
我怎样才能做到这一点?
答案 0 :(得分:1)
你可以挥挥手来实现这一目标。 Passport将deserializeUser
的结果存储在req.user
上(您 使用会话,对吧)?
如果我们想根据用户角色做一些不同的事情,我们有两个选择。一个是呈现不同的观点:
exports.home = function(req, res) {
if (!req.user) {
return res.render('anon');
} else if (req.user.role === 'basic') {
return res.render('basic');
} else if (req.user.role === 'advanced') {
return res.render('advanced');
}
return res.send(500);
};
另一种方法是将req.user.role
传递给您正在使用的任何渲染引擎(我将在这里使用ejs):
exports.home = function(req, res) {
var userRole = req.user ? req.user.role : 'anon';
res.render('home', {
role: userRole
});
};
然后在home.ejs
:
<% if (role === 'basic') { %>
<!-- basic menu -->
<% } else if (role === 'advanced') { %>
<!-- advanced menu -->
<% } %>