node.js - NodeJS ExpressJS PassportJS - 仅用于管理页面

标签 node.js mongodb express mongoose passport.js

我正在使用 NodeJS、ExpressJS、Mongoose、passportJS 和 connect-ensure-login。对用户进行身份验证非常有效。

....
var passport = require('passport')
  , LocalStrategy = require('passport-local').Strategy
  , ensureLoggedIn = require('connect-ensure-login').ensureLoggedIn;

var app = express();
...
app.use(passport.initialize());
app.use(passport.session());    
...


passport.use(new LocalStrategy({usernameField: 'email', passwordField: 'password'},
    function(email, password, done) {
  User.findOne({ 'email': email, 'password': password },
               {'_id': 1, 'email':1}, function(err, user) {

    if (err) { return done(err); }

    if (!user) {
      return done(null, false, { message: 'Incorrect username.' });
    }

    return done(null, user);
  });
}));

passport.serializeUser(function(user, done) {
  done(null, user);
});

passport.deserializeUser(function(user, done) {  
  done(null, user);
});

app.post('/login', passport.authenticate('local',
    { successReturnToOrRedirect: '/home', failureRedirect: '/login' }));

app.get('/logout', function(req, res){
  req.logout();
  res.redirect('/');
});

现在,我想对某些路线添加限制,以便只有管理员才能访问。我怎样才能做到这一点?例如/admin/*

var schema = new mongoose.Schema({
    name: String,
    email: String,
    password: String,
    isAdmin: { type: Boolean, default: false }
});

mongoose.model('User', schema);

有什么提示吗?谢谢

最佳答案

您可以将自定义中间件附加到 /admin/* 路由,该路由将在通过任何更具体的 /admin/ 请求之前检查管理员状态路线:

var ensureLoggedIn = require('connect-ensure-login').ensureLoggedIn;
...
var requiresAdmin = function() {
  return [
    ensureLoggedIn('/login'),
    function(req, res, next) {
      if (req.user && req.user.isAdmin === true)
        next();
      else
        res.send(401, 'Unauthorized');
    }
  ]
};

app.all('/admin/*', requiresAdmin());
app.get('/admin/', ...);

关于node.js - NodeJS ExpressJS PassportJS - 仅用于管理页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17206487/

相关文章:

node.js - 如何在 NodeJs 中扩展 express js res 对象

node.js - 在反向代理模式下使用 NGINX 压缩资源

javascript - NodeJS 护照 Facebook OAuth

javascript - Puppeteer:在异步函数中使用await 调用的javascript 函数中抛出自定义错误消息

java - MongoDB、Java : Retrieve date property as UTC

node.js - 云存储连接域与API服务器

javascript - 对象被垃圾回收后进行清理

python - 导出时使用大JSON会导致内存问题

javascript - Mongoose - 链接 promise

node.js - Heroku Node.js 错误 heroku[路由器] : at=error code=H10 desc ="App crashed" method=GET path ="/"