我有两个用户,买家和管理员在我的应用程序,他们都有不同的登录细节,管理员登录与电子邮件和密码,买家登录与他们的电话号码和我们给他们发送的代码。所以,我做了两个身份验证插头。下面是我如何将插件添加到我的浏览器管道中:
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最后出现,现在买家可以访问其他页面,而管理员不能。有什么关于我如何去做的指导吗?
发布于 2020-03-31 21:54:52
为什么不使用作用域路由并创建两个管道和两个作用域,一个用于买方,另一个用于管理员:
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和路径帮助器的不同结果。
发布于 2020-03-31 14:22:56
在看不到身份验证插件的真实代码的情况下,很难提出任何建议,但一般的建议是:编写两个插件中的一个,然后在那里执行逻辑或。在您当前的代码中,后者似乎总是获胜,这可以用以下伪代码粗略地描述:
a = is_buyer?
a = is_admin?
return a取而代之的是,您希望类似于
a =
cond do
is_buyer? -> :buyer
is_admin? -> :admin
_ -> :unknown
end因此,创建一个将调用现有插件的插件,并在满足任何条件时立即返回。
https://stackoverflow.com/questions/60941598
复制相似问题