Роли подключаются внутри роутера Phoenix - PullRequest
0 голосов
/ 22 января 2020

На данный момент у меня есть плагин ролей, который выглядит следующим образом:

plug Roles, :role

Он получает в качестве второго параметра заданную роль c, и текущий пользователь получается из текущего токена, который является в использовании. Я использую плагин внутри модуля контроллера следующим образом:

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

Проблема в том, что я хочу переместить все эти логи c в router.ex, чтобы было понятно, какие конфиги для контроллеров.

Из документации по умолчанию pipeline/1 и pipe_through/1 получают только атом, который является идентификатором, поэтому невозможно передать параметры в мой штекер.

Что будет правильным способом использовать этот плагин, чтобы я мог использовать его внутри router.ex?

1 Ответ

0 голосов
/ 23 января 2020

Я использовал несколько магов макроса c:

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

Единственный недостаток этого Подход заключается в том, что я не могу указать на атомы контроллеров, поскольку этот плагин выполняется перед плагином маршрутизатора, однако, делая отдельные области действия, можно добиться того же самого.

...