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