2016-10-23 183 views
0

我正在寫一個示例應用程序到鳳凰框架。 我authenticate.ex:插入鳳凰控制器

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 %> 

和事實證明,在頁面的動作,我不要求身份驗證,我得到一個用戶未授權d,即使授權。我怎麼解決這個問題?

+0

「我得到一個用戶沒有被授權」,你的意思是你得到了閃存和重定向,或者你得到了錯誤的菜單? – Dogbert

+0

@Dogbert,我得到了錯誤的菜單 –

+0

當你註銷時'@ conn.assigns [:current_user]'的值是多少?嘗試添加'<%= inspect @ conn.assigns [:current_user]%>'並查看輸出。 – Dogbert

回答

1

我會分兩步分割代碼 - 首先嚐試驗證用戶,從數據庫加載並分配給連接 - 您可以始終運行這個代碼,並簡單地分配nil,一個特殊的guest用戶或任何東西,任何你比較喜歡。第二種方式是強制用戶根據連接中的分配進行身份驗證 - 這個只能在需要的地方運行 - 就像您當前擁有的插件一樣。

+0

我瞭解你,我必須做兩個「認證」 - 一個「軟」選項,其目的是分配當前用戶或來賓,第二個選項 - 一個「硬」,重定向到登錄頁面,如果用戶沒有被授權? –

+0

是的,這就是主意。 – michalmuskala