0

ユーザーの認証を制御する簡単なシステムを作成しています。登録ユーザーのみがサイトにアクセスできます。認証されていない場合は、ログイン ページにリダイレクトされます。

簡単に言えば、このコントロールを作成するためにミドルウェアを使用しています。

私の問題は、リダイレクトの条件が有効な場合、これが起こらないことです!

// 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 が助けてくれました!

@ - - - - - - - - - - 編集:

Auth の管理には Passport を使用することにしました。

問題は 1 つだけです。アプリのルートを別のファイルで実行しています。

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'));
});

ルート/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);
};

ルート/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;
    }
};

ログイン ページへのリダイレクトは正常に機能しますが、別のファイルでルートを管理することになるため、user.js ファイルでコールバック コントロールを処理できるように変数のパスポートを維持せずにはいられません。

アイデア?ありがとう!!!

4

2 に答える 2

4

Connect のセッション ミドルウェアを使用している場合、ほとんどの場合、すべてのリクエストにセッションが関連付けられています。認証済み/未認証の判断を行うために、セッションにユーザー ID (または同様の) が設定されているかどうかを確認する必要があります。

私はPassportの開発者でもあります。これはconnect-ensure-loginミドルウェアと連携して、認証されたルートへのアクセスを保護します。認証システムをすぐに立ち上げて実行できるようになるので、それを見ることをお勧めします。

于 2012-08-28T21:55:07.647 に答える
1

代わりに次のようにします。

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

Express はリクエスタごとにセッションを提供すると確信しています。ログインしているかどうか。したがって、セッションではなくログインでチェックする必要があります。

于 2012-08-28T21:02:57.273 に答える