角色插入路由器凤凰内部
Roles plug inside of router phoenix
目前我有一个角色插件,如下所示:
plug Roles, :role
它接收特定角色作为第二个参数,当前用户是从当前使用的令牌中获取的。我以这种方式使用控制器模块内部的插头:
plug Roles, :manage_users when action in [:index, :show, :delete]
这个问题是我想将所有这些逻辑移动到 router.ex
,以明确控制器的配置是什么。
根据文档,默认 pipeline/1
和 pipe_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
这种方法的唯一缺点是我不能指向控制器的原子,因为这个插件是在路由器插件之前执行的,但是通过制作单独的范围可以实现同样的事情。
目前我有一个角色插件,如下所示:
plug Roles, :role
它接收特定角色作为第二个参数,当前用户是从当前使用的令牌中获取的。我以这种方式使用控制器模块内部的插头:
plug Roles, :manage_users when action in [:index, :show, :delete]
这个问题是我想将所有这些逻辑移动到 router.ex
,以明确控制器的配置是什么。
根据文档,默认 pipeline/1
和 pipe_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
这种方法的唯一缺点是我不能指向控制器的原子,因为这个插件是在路由器插件之前执行的,但是通过制作单独的范围可以实现同样的事情。