如何区分经过身份validation的用户在客户端与Passport和node.js?
我使用Passport.js
与MongoStore
进行身份validation,我使用express
作为Web框架。 一旦用户login,他就可以访问某个路线上的内容。
我想提供不同的内容,取决于哪个用户已authentication 。 比方说,在Mongo的members
集合中,每个members
都拥有一个category
或privileges
属性,然后我将决定向他展示什么。
我将使用AngularJS
来绑定和呈现HTML。
这是我的路线pipe理:
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); }); }); }))
我怎样才能做到这一点?
没有魔杖可以挥手来实现这一点。 护照将deserializeUser
的结果存储在req.user
(您正在使用会话,正确)?
如果我们想根据用户angular色做一些不同的事情,我们有两个select。 一个是提出一个不同的观点:
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 --> <% } %>