我有一個小鳳凰應用程序,允許用戶登錄並查閱他們的個人資料。我用下面簡單的路線:如何限制在鳳凰城訪問某些路線?
resources "/users", MyApp.UserController
但這允許每個用戶通過:index
動作看用戶的列表,以及刪除或更新任何用戶。
限制訪問管理員的最簡單方法是什麼?我應該在每一個動作前加一張支票嗎?或者我應該創建一個可以處理這些操作的資源:"/admin"
?推薦的方式是什麼?
我有一個小鳳凰應用程序,允許用戶登錄並查閱他們的個人資料。我用下面簡單的路線:如何限制在鳳凰城訪問某些路線?
resources "/users", MyApp.UserController
但這允許每個用戶通過:index
動作看用戶的列表,以及刪除或更新任何用戶。
限制訪問管理員的最簡單方法是什麼?我應該在每一個動作前加一張支票嗎?或者我應該創建一個可以處理這些操作的資源:"/admin"
?推薦的方式是什麼?
您可以使用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
像你提到的限制功能。
你也可以定義一個單獨的管道經過身份驗證的端點:
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
管理範圍只是一個例子,它可以是任何你喜歡的,但管道的想法保持一致。
這種技術將使您的控制器保持清潔,但並非總是可行。這取決於您的確切要求。
不錯!它工作正常。我有種直覺認爲插件有什麼用處,因爲我在Phoenix.Controller api doc的例子中讀到了這些,但我不確定它是否打算由最終用戶應用,或者如果它是針對核心開發人員。 順便說一下,有沒有辦法從conn中提取連接源域?我想重定向到調用url(使用不同的參數)以防sso登錄成功... – adanselm 2014-09-27 18:52:36