【问题标题】:How to distinguish an authenticated user at client side with Passport and node.js?如何在客户端用 Passport 和 node.js 区分经过身份验证的用户?
【发布时间】:2014-07-13 02:24:37
【问题描述】:

我使用 Passport.jsMongoStore 进行身份验证,我使用 express 作为 Web 框架。用户登录后,他可以访问特定路径的内容。

我想根据已通过身份验证的用户提供不同的内容。假设在 members 的 Mongo 集合中,每个人都有一个 categoryprivileges 属性,然后我将确定要显示给他的内容。 p>

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

我怎样才能做到这一点?

【问题讨论】:

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


    【解决方案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 -->
    <% } %>
    

    【讨论】:

    • 谢谢,非常简单的解释。如果我现在不使用任何渲染引擎怎么办(我知道我应该)。我怎么能做到?我当时想把这项工作交给 Angular。我还认为,例如打印"Hello SomeKittens" 以重定向到/admin?user=SomeKittens
    • @diegoaguilar 没问题。您可以将角色变量发送回 Angular 并随意操作。不过,最好将其完全保留在服务器端。
    • 我是新手。因此,假设我将它保留在服务器端,然后我想要 credits(例如),所以当我访问/credits 时,我可以在服务器端检查req.user.rolereq.user.credits。或者例如,为了取代典型的“欢迎用户”,我可以让 Angular 访问 /username?
    • 前往JS Chat room,我们可以为您提供帮助。
    • 您还可以使用 Express 的 Router() 根据权限过滤掉用户(因为您可以根据加载的 Route 设置自定义中间件)。只需添加一个简单的方法调用,如果他们的用户权限无效,它将重定向他们。
    猜你喜欢
    • 1970-01-01
    • 2018-05-04
    • 1970-01-01
    • 1970-01-01
    • 2017-09-11
    • 2021-01-04
    • 1970-01-01
    • 1970-01-01
    • 2014-07-04
    相关资源
    最近更新 更多