【问题标题】:Middleware not redirect中间件不重定向
【发布时间】:2012-08-28 16:38:47
【问题描述】:

我正在编写一个简单的系统来控制用户的身份验证,只有注册用户才能访问该站点。如果您未通过身份验证,请将您重定向到登录页面。

很简单,我正在使用中间件来制作这个控件。

我的问题是,当重定向的条件有效时,这不会发生!

// Routes
module.exports = function(app) {
app.use(function(req, res, next) {
    console.log(req.url);

    if (typeof(res.session) == 'undefined' && req.url != '/users/login') {
        console.log('redirect');
        res.redirect('/users/login');
    } else {
        console.log('no redirect');
        next();
    }
});

app.get('/',                    routes.site.index);

app.all('/users/login',         routes.user.login);
};

显然,粗壮的控制台是:

/
redirect
/users/login
no redirect

页面正在无限加载...

有什么建议吗?

谢谢!

PS:如果我拼错了,我很抱歉,Google 帮助了我!

@-------------------- 编辑:

我选择使用 Passport 来管理身份验证。

我只有一个问题,我在一个单独的文件中运行我的应用程序的路由。

app.js

// Auth
var passport = require('passport'), strategy = require('passport-local').Strategy;
passport.use(new strategy(function(username, password, done) {
var user = require('./db')('user');

user.findOne({username: username}, function(err, user) {
    if (err) return done(err);
    if (!user) return done(null, false);
    if (!user.validPassword(password)) return done(null, false);

    return done(null, user);
});
}));
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
var user = require('./db')('user');

user.findOne(id, function(err, user) {
    done(err, user);
});
});
// End Auth

require('./routes')(app, passport);

app.configure(function(){
  app.set('port', process.env.PORT || 3000);
  app.set('views', __dirname + '/views');
  app.set('view engine', 'jade');
  app.use(express.favicon());
  app.use(express.logger('dev'));
  app.use(express.bodyParser());
  app.use(passport.initialize());
  app.use(passport.session());
  app.use(express.methodOverride());
  app.use(app.router);
  app.use(express.static(__dirname + '/public'));
});

routes/index.js

// Routes
module.exports = function(app, passport) {
    app.get('/', passport.authenticate('local', {successRedirect: '/', failureRedirect: '/login' }), routes.site.index);

    app.all('/login', routes.user.login);
};

routes/user.js

exports.login = function(req, res, next) {
    switch (req.method) {
        default:
        case 'GET':
            res.render('user/login', {title: 'Login'});
        break;
        case 'POST':
            /*passport.authenticate('local', function(err, user, info) {
                res.json([user, info]);
            });
            */
        break;
    }
};

到登录页面的重定向工作正常,但我会在不同的文件中管理路由,所以我不能帮助维护变量 passport 以便能够处理文件中的回调控制用户.js。

想法? 谢谢!!!

【问题讨论】:

  • routes.user.login 长什么样子?
  • 在这种情况下未定义不是字符串,只需删除它周围的引号即可。这是一个保留字,有点像 null。
  • @RyanLaBarre 这是我最初的答案,但我修改了它,因为我注意到他使用的 typeof() 确实返回了一个字符串。你不能使用 typeof(),你可以用关键字 undefined 来评估它,对吧?
  • 我强烈建议您使用身份验证模块。我推荐 Jared Hanson 的 Passport.js

标签: node.js authentication express middleware


【解决方案1】:

如果您使用 Connect 的会话中间件,很可能每个请求都会有一个与之关联的会话。您需要检查会话中是否设置了用户 ID(或类似的 ID),以做出经过身份验证/未经身份验证的决定。

我也是Passport 的开发人员,它与connect-ensure-login 中间件一起工作以保护对经过身份验证的路由的访问。我建议您查看一下,因为它可以让您快速启动并运行身份验证系统。

【讨论】:

  • 是的,我认为原始发帖人将会话与成功登录混淆了,因为我看了两遍。一开始我以为他没有使用 typedef()
  • 刚刚想通了。 Passport 网站实际上并没有特别提到使用“connect-ensure-login”。我查看了这个要点gist.github.com/jaredhanson/3989193 并意识到我需要它。
【解决方案2】:

改为这样做:

if (user.loggedin === undefined && req.url != '/users/login')

我很确定 Express 会为每个请求者提供一个会话;登录与否。因此,您需要检查登录而不是会话。

【讨论】:

  • 实际上,我不确定我对您问题的回答。在这里发表评论,让我知道这是否有帮助。我认为每个访问您网站的客户都会获得一个会话,只是您想评估他们是否已登录。
猜你喜欢
  • 2017-12-22
  • 2020-04-18
  • 2016-07-30
  • 2013-09-04
  • 2019-06-24
  • 1970-01-01
  • 2019-08-14
  • 1970-01-01
  • 2018-04-24
相关资源
最近更新 更多