我有一个小的Phoenix应用程序,允许用户登录并查询其个人资料。我使用以下简单路线:

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

最好将用于公共(public)/受限访问的 Controller 分开,所以我将像您对受限功能所做的引用一样添加一个Admin.UserController

关于elixir - 如何限制进入 Phoenix 的某些路线?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26055501/

10-15 23:20