10

ユーザーがログインして自分のプロファイルを参照できるようにする小さな Phoenix アプリケーションがあります。次の簡単なルートを使用しました。

resources "/users", MyApp.UserController

ただし、これにより、すべてのユーザーがアクションを介してユーザーのリストを表示したり、ユーザーを:index削除または更新したりできます。

アクセスを管理者のみに制限する最も簡単な方法は何ですか? すべてのアクションの前にチェックを追加する必要がありますか? "/admin"または、それらの操作を処理するリソースを作成する必要がありますか? おすすめの方法は?

4

3 に答える 3

14

でプラグを使用しますUserController0.4.x条件付きでプラグインする機能はありませんが、次のような方法で目的を達成できます。

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。そのため、制限付き機能について参照したようなものを追加します。

于 2014-09-26T14:29:03.933 に答える
2

認証済みエンドポイント用に別のパイプラインを定義することもできます。

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

admin スコープは単なる例であり、好きなものを指定できますが、パイプラインの考え方は一貫しています。

この手法はコントローラーをクリーンに保ちますが、常に可能であるとは限りません。それはあなたの正確な要件に依存します。

于 2016-03-16T16:59:47.687 に答える