如何限制凤凰​​城某些路线的访问?

ada*_*elm 9 elixir phoenix-framework

我有一个小凤凰应用程序,允许用户登录并查阅他们的个人资料.我使用了以下简单路线:

resources "/users", MyApp.UserController
Run Code Online (Sandbox Code Playgroud)

但这允许每个用户通过:index操作查看用户列表,以及删除或更新任何用户.

限制访问管理员的最简单方法是什么?我应该在每个动作前加一张支票吗?或者我应该创建一个"/admin"可以处理这些操作的资源?推荐的方式是什么?

Chr*_*ord 13

你可以使用插件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
Run Code Online (Sandbox Code Playgroud)

即将推出的更改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
Run Code Online (Sandbox Code Playgroud)

保持控制器的公共/限制访问是分开的,所以我会添加一个Admin.UserController类似于你参考的限制功能.