Как я могу использовать 2 плагина для аутентификации в Phoenix? - PullRequest
1 голос
/ 31 марта 2020

У меня есть два пользователя, Покупатель и Администратор в моем приложении, у них обоих разные учетные данные, администратор входит в систему с помощью электронной почты и пароля, покупатель входит в систему со своим номером телефона и кодом, который мы им отправляем. Итак, я сделал две заглушки аутентификации. Вот как я добавил плагины в свой конвейер браузера:

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

Итак, вот проблема, когда администратор входит в систему, он получает меню входа и может получить доступ ко всем другим страницам. Когда покупатель входит в систему, я могу видеть из журналов (я ввожу / проверяю коннект, так что я знаю, что они вошли в систему), они все еще получают меню «Выйти», они также не могут получить доступ к некоторым страницам. Если я изменю порядок трубопровода, чтобы AffirmWeb.BuyerAuth был последним, теперь покупатель может получить доступ к другим страницам, а администратор - нет. Любое руководство о том, как я могу go об этом?

Ответы [ 2 ]

2 голосов
/ 31 марта 2020

Почему бы не использовать маршруты с областями действия и создать два конвейера и две области: один для покупателей и один для администраторов:

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, чтобы получить разные результаты для созданных URL-адресов и помощников пути.

0 голосов
/ 31 марта 2020

Чрезвычайно сложно что-либо предложить, не видя реального кода плагинов аутентификации, но общий совет будет таким: составьте один плагин из двух и сделайте логический или там. В вашем текущем коде последний, кажется, всегда побеждает, что может быть грубо описано следующим псевдокодом:

a = is_buyer?
a = is_admin?
return a

Вместо этого вы хотите что-то вроде

a = 
  cond do
    is_buyer? -> :buyer
    is_admin? -> :admin
    _ -> :unknown
  end

Итак, создайте плагин это вызовет ваши существующие пробки и вернется, как только будет выполнено любое условие.

...