2016-04-17 11 views
3

基本的に私のアプリケーションのログイン/登録ランディングページがあります。ユーザーがログインまたは登録した後、私は彼らがもうこのルートにアクセスできないようにします。私はHapi.jsでこれを達成する方法がわかりません。ログインページは認証戦略を使用しないので、ユーザーがログインしているかどうかはわかりません。ユーザーがHapi.jsでログインしている場合にログインルートを無効にする

答えて

7

私が通常これを使用するアプローチは、ルート自体を無効にするのではなく、ログインしているユーザーをログインルートからリダイレクトすることです。

誤って指摘したように、ログインルートは現在、認証戦略が設定されていないユーザーがログインしているかどうかはわかりません。解決策は、のログイン戦略に認証戦略を追加することですが、を試してモードを使用してください。これは、認証が成功したかどうかにかかわらずハンドラが実行されることを意味します。そのトリックは、ユーザーが(request.auth.isAuthenticatedの値を調べることによって)認証されているかどうかを確認し、それに応じて反応することができるということです。

だからあなたのルートは、次のようになります。同じ結果に

server.route({ 
    config: { 
     auth: { 
      strategy: 'session', 
      mode: 'try' 
     } 
    }, 
    method: 'GET', 
    path: '/login', 
    handler: function (request, reply) { 

     if (request.auth.isAuthenticated) { 
      return reply.redirect('/');  // user is logged-in send 'em away 
     } 

     return reply.view('login');   // do the login thing 
    } 
}); 

別のアプローチは、すべてのルートのデフォルトとしてモードを試してみてくださいであなたの認証戦略を設定することです:

server.auth.strategy('session', 'cookie', 'try', {  
    password: 'password-that-is-longer-than-32-chars', 
    isSecure: true 
}); 

3番目の引数tryに注目してください。この方法では、デフォルトでこの戦略を試すため、ルート自体に認証設定を追加する必要はありません。 server.auth.strategyドキュメントによれば:

mode - trueの場合は、方式が自動的に認証設定せずに任意の経路に必要な戦略として割り当てられています。単一のサーバー戦略にのみ割り当てることができます。値はtrue(「必須」と同じ)または有効な認証モード(「必須」、「オプション」、「試行」)でなければなりません。デフォルトはfalseです。

hapiサイトのAuthentication tutorialのモードに関する情報があります。

+1

偉大な答えは、私は '試し 'オプションを見落としたか分からない。 –

関連する問題