如何区分客户端的身份验证用户与Passport和node.js?

时间:2014-05-23 16:19:50

标签: javascript angularjs node.js mongodb passport.js

我使用 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);
    });
  });
}))

我怎样才能做到这一点?

1 个答案:

答案 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 -->
<% } %>