2016-10-23 18 views
0

私はPhoenixフレームワークにサンプルアプリケーションを書いています。 私authenticate.ex:私は、単一のアクションの認証を必要としないで、コントローラがあるphoenixコントローラのプラグ

defmodule Myapp.Plug.Authenticate do 
    import Plug.Conn 
    import Myapp.Router.Helpers 
    import Phoenix.Controller 

    def init(default), do: default 

    def call(conn, default) do 
    current_user = get_session(conn, :current_user) 
    if current_user do 
     assign(conn, :current_user, current_user) 
    else 
     conn 
     |> put_flash(:error, 'You need to be signed in to view this page') 
     |> redirect(to: session_path(conn, :new)) 
    end 
    end 
end 

defmodule Myapp.SharedLinkController do 
    use Myapp.Web, :controller 
    alias Myapp.SharedLink 

    plug Myapp.Plug.Authenticate when action in [:new, :create] 

... 

end 

それは動作しますが、問題はメニュー表示が依存があるということです

<%= if Map.has_key?(@conn.assigns, :current_user) do %> 
    <li>first</li> 
<% else %> 
    <li>second</li> 
<% end %> 

、それは私が認証を必要としないページアクション、上、私は、ユーザーが認可されていないことを得ることが判明:ユーザーが許可されているかどうかにそれが許可されていても。どうすればこの問題を解決できますか?

+0

「ユーザーが承認されていないことが判明しました」というのは、フラッシュを取得してリダイレクトする、または間違ったメニューを表示するということですか? – Dogbert

+0

@Dogbert、間違ったメニューが表示される –

+0

ログアウトしたときに '@ conn.assigns [:current_user]'の値は何ですか? '<%= inspect @ conn.assigns [:current_user]%>'を追加し、出力を見てください。 – Dogbert

答えて

1

ユーザーを認証し、データベースから読み込んで接続に割り当てることを試みるコードを2つのステップで分割します。これはいつでも実行でき、nil、特別なゲストユーザーまたは何も指定しないあなたは好きです。 2つ目は、接続の割り当てに基づいてユーザーが認証されるように強制します。これは、現在必要なプラグインのような場所でのみ実行されます。

+0

私は2つの "認証" - 現在のユーザーまたはゲストを割り当てることを目的とした "ソフト"オプションと、ログインページにリダイレクトする "ハード"という2つのオプションを行う必要があることを理解していますか?ユーザーは承認されていませんか? –

+0

はい、それは考えです。 – michalmuskala