首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Phoenix中使用2个身份验证插件?

如何在Phoenix中使用2个身份验证插件?
EN

Stack Overflow用户
提问于 2020-03-31 08:26:33
回答 2查看 202关注 0票数 1

我有两个用户,买家和管理员在我的应用程序,他们都有不同的登录细节,管理员登录与电子邮件和密码,买家登录与他们的电话号码和我们给他们发送的代码。所以,我做了两个身份验证插头。下面是我如何将插件添加到我的浏览器管道中:

代码语言:javascript
运行
复制
pipeline :browser do
  plug :accepts, ["html"]
  plug :fetch_session
  plug :fetch_flash
  plug Phoenix.LiveView.Flash
  plug :protect_from_forgery
  plug :put_secure_browser_headers
  plug AffirmWeb.BuyerAuth
  plug AffirmWeb.AdminAuth
end

这就是问题所在,当管理员登录时,他们会看到登录菜单,并且可以访问所有其他页面。当买家登录时,我可以从日志中看到(我IO.inspect连接,以便我知道他们已经登录),他们仍然得到“注销”菜单,他们也不能访问一些页面。如果我改变管道顺序,让AffirmWeb.BuyerAuth最后出现,现在买家可以访问其他页面,而管理员不能。有什么关于我如何去做的指导吗?

EN

回答 2

Stack Overflow用户

发布于 2020-03-31 21:54:52

为什么不使用作用域路由并创建两个管道和两个作用域,一个用于买方,另一个用于管理员:

代码语言:javascript
运行
复制
pipeline :browser do
  plug :accepts, ["html"]
  plug :fetch_session
  plug :fetch_flash
  plug Phoenix.LiveView.Flash
  plug :protect_from_forgery
  plug :put_secure_browser_headers
end

pipeline :buyer do
  plug AffirmWeb.BuyerAuth
end

pipeline :admin do
  plug AffirmWeb.AdminAuth
end

scope "/" do
  pipe_through :browser

  # ...routes for unauthenticated visitors...
end

scope "/buyer", AffirmWeb.Buyer do
  pipe_through [:browser, :buyer]

  # ...buyer routes...
end

scope "/admin", AffirmWeb.Admin, as: :admin do
  pipe_through [:browser, :admin]

  # ...admin routes...
end

现在,区分用户类型和使用不同的插头、控制器或布局模板要容易得多。

您可以尝试使用scope的选项,以获得生成的urls和路径帮助器的不同结果。

票数 2
EN

Stack Overflow用户

发布于 2020-03-31 14:22:56

在看不到身份验证插件的真实代码的情况下,很难提出任何建议,但一般的建议是:编写两个插件中的一个,然后在那里执行逻辑或。在您当前的代码中,后者似乎总是获胜,这可以用以下伪代码粗略地描述:

代码语言:javascript
运行
复制
a = is_buyer?
a = is_admin?
return a

取而代之的是,您希望类似于

代码语言:javascript
运行
复制
a = 
  cond do
    is_buyer? -> :buyer
    is_admin? -> :admin
    _ -> :unknown
  end

因此,创建一个将调用现有插件的插件,并在满足任何条件时立即返回。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60941598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档