2017-02-26 4 views
1

私はPassportJSを使用しています。サインアップとログインの機能は非常にスムーズです。ユーザが一度認証された場合、passportjsに再度ログインすることを禁止しますか?

私はPassportJS(私もセッションを使用しています)に直面している唯一の問題は、ユーザーがログインしていてもサインアップ/ログインURLに戻ってサインアップしたりログインし直すことができることです!

これは私を魅了しています。誰かが修正/提案をしている場合は、それを置いてください。

UPDATE - の1

垣間見る私routes.js:(あなたがアクセス制御の任意の並べ替えを作成していない

app.get('*', function(req, res, next) { 
    if (req.url.indexOf('/users/login') < 0 && 
     req.url.indexOf('/users/signup') < 0) { 
     req.session.returnTo = null; 
    } 
    next(); 
}); 

// ===================================== 
// HOME PAGE (with login links) ======== 
// ===================================== 
app.get('/', sabSettings, function(req, res) { 
    Setting.findOne(function(err, setting) { 
     if (err) 
      throw err; 
     // console.log(setting); 
     res.render('index', { title: 'eduBird | Reach the glory', setting: req.setting }); // load the index file 
    }); 
}); 

// ===================================== 
// LOGIN =============================== 
// ===================================== 
// show the login form 
app.get('/login', sabSettings, function(req, res) { 

    // render the page and pass in any flash data if it exists 
    res.render('login', { 
     message: req.flash('loginMessage'), 
     errors: req.flash('error'), 
     title: 'Login | eduBird', 
     setting: req.setting 
    }); 
}); 

// process the login form 

app.post('/login', passport.authenticate('local-login', { 
    successReturnToOrRedirect: '/loggedin', 
    failureRedirect: '/login', 
    failureFlash: true 
})); 

// ===================================== 
// SIGNUP ============================== 
// ===================================== 
// show the signup form 
app.get('/signup', sabSettings, function(req, res) { 

    // render the page and pass in any flash data if it exists 
    process.nextTick(function() { 
     res.render('signup', { 
      message: req.flash('signupMessage'), 
      errors: req.flash('error'), 
      title: 'Register | eduBird', 
      setting: req.setting 
     }); 
    }); 
}); 

// process the signup form 
app.post('/signup', passport.authenticate('local-signup', { 
    successReturnToOrRedirect: '/profile/welcome', 
    failureRedirect: '/signup', 
    failureFlash: true 
})); 
+1

コードAnimeshを提供できますか? –

+1

それがあなたの問題を解決するかどうか教えてください –

+0

@Kudzaiそれは働いた。ありがとう。 –

答えて

2

connet-確保ログインと一緒にPassportJSを使用しますが、ありません。

  1. ユーザーがログインフォームを送信すると、POSTリクエストtを送信すると、問題が解決されます。 o指定されたパスが作成され、passport.authenticateが実行されます。
  2. そのルートの認証ミドルウェアはローカル戦略を処理するように設定されています。パスポートはローカル戦略の実装を呼び出します。
  3. データベースとの対話中にエラーが発生した場合、done(err)が呼び出されます。そうでない場合、ユーザーが見つからないか、パスワードが一致しない場合は、done(null、false)を呼び出します。成功した場合は、done(null、user)を呼び出します。

これを行うと、passport.authenticateに戻り、対応するリダイレクトが実行されます。サインインが成功した場合は、この時点で

は、ユーザーオブジェクト(完了(ヌル、利用者からは)) 要求に取り付けられており、あなたが req.userを介してユーザオブジェクトにアクセスすることができます。

主なアイデアは、ユーザオブジェクトがリクエストに添付されていない場合は、ユーザがログインしていないことを意味します。したがって、 ユーザがreq.userを使用してログインしたときのアプリケーションの動作を制御できます。例:

// If the user object does not exist it means the user is not logged in 
    if (!req.user) { 
     res.render('signin'); 
    } else { 
// If the user object exists, the user is logged in and if they try to log in we redirect them to the home page 
     return res.redirect('/'); 
    } 

これが役立つことを望みます。

+0

それは魅力的に働き、シンプルで、このようなホームページを制限するためのアイデアもありました。ありがとう! –

+0

hii Kudzaiコードはうまく動作しますが、私はセッションの待機時間をどのようにすることができますを統合する必要があります。 ありがとうございます。 – Yash

+0

@Nodejsそれは明白なセッションのことですが、クッキーのmaxAge属性を使ってセッションの有効期限を設定してください。明示的セッション[documentation](https://www.npmjs.com/package/express-session)には良いイラストがあります –

関連する問題