角色插入路由器凤凰内部

Roles plug inside of router phoenix

目前我有一个角色插件,如下所示:

plug Roles, :role

它接收特定角色作为第二个参数,当前用户是从当前使用的令牌中获取的。我以这种方式使用控制器模块内部的插头:

plug Roles, :manage_users when action in [:index, :show, :delete]

这个问题是我想将所有这些逻辑移动到 router.ex,以明确控制器的配置是什么。

根据文档,默认 pipeline/1pipe_through/1 仅接收一个作为标识符的原子,因此无法将参数传递给我的插件。

使用此插件的正确方法是什么,以便我可以在 router.ex 中使用它?

我最终使用了一些宏魔法:

defmodule PlugUtils do

  defmacro __using__(_) do
    quote do
      import unquote(__MODULE__)
    end
  end

  defmacro param_pipe(pipe_name, plug_name, plug_params) do
    quote do
      pipeline unquote(pipe_name) do
        plug unquote(plug_name), unquote(plug_params)
      end

      pipe_through unquote(pipe_name)
    end
  end
end

依次可以通过以下方式在路由器模块中使用:

use PlugUtils
param_pipe :backups_upload, RolePlug, :upload_backup

这种方法的唯一缺点是我不能指向控制器的原子,因为这个插件是在路由器插件之前执行的,但是通过制作单独的范围可以实现同样的事情。