Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
指定需要Elixir Phoenix中经过身份验证的用户的资源路由_Elixir_Phoenix Framework - Fatal编程技术网

指定需要Elixir Phoenix中经过身份验证的用户的资源路由

指定需要Elixir Phoenix中经过身份验证的用户的资源路由,elixir,phoenix-framework,Elixir,Phoenix Framework,我正在使用Elixir Phoenix应用程序中的用户登录、注册和身份验证。它附带了一个:require_authenticated_user插件,用于确定特定路由是否要求用户在访问之前进行身份验证 如果我的router.ex中有一个帖子资源,可以提供所有标准操作: resources "/posts", PostController 如何最好地组织某些路由以要求用户登录?例如,查看所有帖子或查看单个帖子不需要登录。但是,创建、编辑、更新、删除帖子需要用户登录 有没有一种方

我正在使用Elixir Phoenix应用程序中的用户登录、注册和身份验证。它附带了一个
:require_authenticated_user
插件,用于确定特定路由是否要求用户在访问之前进行身份验证

如果我的
router.ex
中有一个帖子资源,可以提供所有标准操作:

resources "/posts", PostController
如何最好地组织某些路由以要求用户登录?例如,查看所有帖子或查看单个帖子不需要登录。但是,创建、编辑、更新、删除帖子需要用户登录


有没有一种方法可以管理哪些路由需要身份验证,而无需在两个单独的
范围
块中分别指定我的所有路由,这两个块具有单独的
管道通过
s?

我知道的唯一方法是使用两个范围。下面是一个示例,我两次声明相同的范围,但其中一个使用了额外的
:auth
管道。注意我如何使用
:only
选项来指定允许哪些控制器方法:

  pipeline :browser do
    plug :accepts, ["html"]
    plug :fetch_session
    plug :fetch_flash
    plug :protect_from_forgery
    plug :put_secure_browser_headers
  end

  pipeline :auth do
    plug MyAppWeb.Auth
  end

  scope "/", MyAppWeb do
    pipe_through :browser

    resources "/posts", PostController, only: [:index]
  end

  scope "/", MyAppWeb do
    pipe_through :browser
    pipe_through :auth

    resources "/posts", PostController, only: [:show, :new, :create]
  end

诀窍是使用
:仅使用
说明允许以这种方式调用控制器中的哪些函数。路由器将匹配它找到的第一个,因此如果在两个作用域中使用相同的方法两次,例如
:index
,那么它将使用第一个作用域(即,第一个词汇定义的作用域。-文件中的第一个)

我希望这是有道理的。如果你愿意,我可以解释得更多

顺便说一句,也许可以尝试一下,看看它是否有效:

  scope "/", MyAppWeb do
    pipe_through :browser
    resources "/posts", PostController, only: [:index]

    pipe_through :auth
    resources "/posts", PostController, only: [:show, :new, :create]
  end

如以下文件所述:

每次调用
pipe_至/1
,新管道都会附加到先前给定的管道上

也就是说,这将起作用:

scope/,MyWeb do
管道通过[:浏览器]
获取“/索引”,后控制器
管道通过,:auth
获取“/显示”,后置控制器
post“/创建”,后控制器
放置“/更新”,后置控制器
结束

另一个解决方案是直接在控制器中使用插头

defmodule MyWeb.PostController do
plug:auth when action in~w | show create update | a
def显示(连接,参数)do
# ...
结束
结束