2017-03-25 9 views
0

Phoenixを使って同じルート "/"に2つのページをどのように実装できるのでしょうか? 1つは認証されていないユーザー用、もう1つは認証ユーザー用です。これが起こるユースケースの例は、ログインページがログインした後のログインページが「/」に、アプリケーションが「/」にログインしたLinkedInとFacebookです。2つのルートページ。認証されていないユーザのためのもの、認証されたユーザのためのもの

私はGuardianを認証に使用しています。以下のように:FrontControllerが認証されていないユーザー(例えば、ログイン・ページ)からアクセス可能なページを提供し、ApplicationControllerには、実際のアプリケーションを提供しています

pipeline :auth do 
    plug Guardian.Plug.EnsureAuthenticated, handler: App.AuthHandler 
    end 
pipeline :unauth do 
    plug Guardian.Plug.EnsureNotAuthenticated, handler: App.AuthHandler 
end 

scope "/", App.Web do 
    pipe_through [:browser, :unauth] 

    get "/", FrontController, :index 
end 
scope "/", App.Web do 
    pipe_through [:browser, :auth] 

    get "/page", ApplicationController, :index 
end 

ApplicationControllerが "/ page"の代わりに "/"を提供する場合、 "1行目の前の節は常に一致するため、この節は一致しません"というエラーがスローされます。

私はif文と両方のページを扱う1つのコントローラを使用すると思いますが、残念ながらこのような戦略を実装する方法に関するドキュメントは見つかりませんでした。

+3

私はこれがフェニックスのルータで実行できるとは思わない。新しいコントローラへのルートを指し示すことができ、それからユーザがログインしている場合は 'ApplicationController.index'を、それ以外の場合は' FrontController.index'を呼び出します。 – Dogbert

+0

@Dogbertまたは 'FrontController.index'の中から' ApplicationController.index'に委譲します。 – mudasobwa

答えて

2

私の謙虚な意見では、これを処理するより良い方法は、認証されていないユーザーには"/"、認証されたユーザーには"/app"(または何か)の2つの異なる名前空間を使用することです。これにより、ユーザーとユーザーがこの2つを区別しやすくなり、システムの複雑さが軽減されます。認証されていないユーザーが"/app"ルートに行くことにしようとした場合、あなたは「あなたがそれを行うには、ログインする必要があります。」のような、適切なエラーメッセージと一緒にあなたのApp.AuthHandlerの内側から(401 Unauthorized応答を返すことができ

しかし、もしをあなたが書いたものをやって主張し、私はただ単にApplicationController.indexでそのシナリオを扱うないだろう - FrontControllerの必要性をそのインデックスのアクションは次のようなものになります。この方法で

defmodule MyApp.Web.ApplicationController do 

    def index(conn, _) do 
    case logged_in?(conn) do 
     true -> 
     user = Guardian.Plug.current_resource(conn) 
     render conn, "logged_in_page.html", user: user 
     false -> 
     render conn, "front_page.html" 
    end 
    end 

    # Note: This could be in a helper module 
    defp logged_in?(conn) do 
    Guardian.Plug.authenticated?(conn) 
    end 
end 

を、ユーザーが異なるを提供しています有効なJWTを持っているかどうかによって、"/"に移動したときのページ

この方法でもシステムが複雑になります。そして、一般的に言えば、本当に良い理由がない限り、複雑さを避けるべきです。可能な限り慣習に従ってください。後で感謝するでしょう。 :)

0

おそらく、あなたがしたいことは、ルータではなくコントローラ&ビューレンダーレイヤーでこれを処理することです。

「ルート」またはホームコントローラ(「/」をハンドラとして扱うもの)内には、有効な認証済みユーザがいるかどうかをチェックして、必要なビューをレンダリングすることができますそれ。

関連する問題