2014-09-26 103 views
8

我有一個小鳳凰應用程序,允許用戶登錄並查閱他們的個人資料。我用下面簡單的路線:如何限制在鳳凰城訪問某些路線?

resources "/users", MyApp.UserController 

但這允許每個用戶通過:index動作看用戶的列表,以及刪除或更新任何用戶。

限制訪問管理員的最簡單方法是什麼?我應該在每一個動作前加一張支票嗎?或者我應該創建一個可以處理這些操作的資源:"/admin"?推薦的方式是什麼?

回答

11

您可以使用UserController中的插件。 0.4.x對有條件器插頭S沒有能力,但你可以達到你想要的東西像什麼:

defmodule MyApp.UserController do 
    use Phoenix.Controller 

    plug :authenticate, :admin 
    plug :action 

    def index(conn, _) do 
    render conn, "index" 
    end 

    def create(conn, params) do 
    # do the creating 
    end 
    ... 

    defp authenticate(conn, :admin) do 
    do_auth(conn, action_name(conn)) 
    end 
    defp do_auth(conn, action) when action in [:create, :update, :destroy] do 
    if AdminAuth.authenticated?(conn) do 
     conn 
    else 
     halt conn 
    end 
    end 
    defp do_auth(conn, _action), do: conn 
end 

的變化即將在0.5將方便有條件的插頭,即:

defmodule MyApp.UserController do 
    use Phoenix.Controller 

    plug :authenticate, :admin when action in [:create, :update, :destroy] 

    def index(conn, _) do 
    render conn, "index" 
    end 

    def create(conn, params) do 
    # do the creating 
    end 
    ... 

    defp authenticate(conn, :admin) do 
    if AdminAuth.authenticated?(conn) do 
     conn 
    else 
     halt conn 
    end 
    end 
end 

這是一個好主意保持您的控制器公開/限制訪問分開,所以我會添加一個Admin.UserController像你提到的限制功能。

+0

不錯!它工作正常。我有種直覺認爲插件有什麼用處,因爲我在Phoenix.Controller api doc的例子中讀到了這些,但我不確定它是否打算由最終用戶應用,或者如果它是針對核心開發人員。 順便說一下,有沒有辦法從conn中提取連接源域?我想重定向到調用url(使用不同的參數)以防sso登錄成功... – adanselm 2014-09-27 18:52:36

1

你也可以定義一個單獨的管道經過身份驗證的端點:

defmodule MyApp.Router do 
    use MyApp.Web, :router 

    pipeline :admin do 
    plug :accepts, ["html"] 

    plug Authentication # this represents some plug that provides authentication 
    end 

    scope "/", MyApp do 
    pipe_through :browser 

    resources "/things", ThingController 
    end 

    scope "/admin", MyApp do 
    pipe_through :admin 

    resources "/admin/things", Admin.ThingsController 
    end 
end 

管理範圍只是一個例子,它可以是任何你喜歡的,但管道的想法保持一致。

這種技術將使您的控制器保持清潔,但並非總是可行。這取決於您的確切要求。