Возможно ли для зависимости создать таблицу базы данных в elixir?

#elixir #metaprogramming #phoenix-framework #ecto

#elixir #метапрограммирование #phoenix-framework #ecto

Вопрос:

Я пытаюсь создать простую систему аутентификации в elixir / phoenix, которую можно использовать в качестве зависимости в любом приложении phoenix.

Я выполнил шаги, описанные в programming-phoenix-1.4 книге, и достаточно легко настроил базовую систему аутентификации.

В этой книге рассказывается о разделении конфиденциальной и нечувствительной информации пользователя в разные места в приложении и базе данных. Вся конфиденциальная информация (имя пользователя и т.д.) помещается в users таблицу, В то время как конфиденциальная информация (электронная почта, пароль и т.д.) помещается в credentials таблицу.

Исходя из этого, я подумал, можно ли было бы выделить логику аутентификации в ее собственное приложение.

Этому модулю аутентификации потребуется:

  1. создайте credentials таблицу в базе данных требуемого приложения
  2. обновите указанную таблицу на основе информации, переданной из родительского приложения
  3. содержит, auth plug способную обновлять conn из родительского приложения (например, добавление :current_user к conn с помощью assign функции)

К сожалению, на данный момент я сталкиваюсь с первым препятствием. Я не уверен, возможно ли требовать модуль, который может создавать таблицу базы данных.

Я полагаю, что если шаг 1 возможен, то шаг 2 будет простым. Похоже, что шаг 3 может быть выполнен с помощью функции Router.forward / 4.

Комментарии:

1. Я не уверен, что упоминается в этой книге, но я с трудом понимаю причины или разделение пользовательской информации на две отдельные таблицы. Кроме того, насколько этот модуль, который вы предлагаете, был бы лучше, чем проверенный в боях Guardian ?

2. @AlekseiMatiushkin Большое спасибо за ваш ответ (и за все ваши другие ответы на вопросы elixir). Я в основном использовал это как учебный опыт и хотел знать, возможно ли мне реализовать эту идею. Я подумал, что это поможет создать простой процесс регистрации / входа / выхода из системы в любом приложении, которое я создаю, следуя урокам программирования phx 1.4. Моей целью не было создавать что-то, что я использовал бы поверх чего-то подобного Guardian в «реальном» проекте.

Ответ №1:

Это возможно, если присвоить зависимости имя модуля repo. Примером этого является GuardianDB создание таблицы для хранения допустимых токенов. Конфигурация для GuardianDB выглядит следующим образом:

 config :guardian, Guardian.DB,
  repo: MyApp.Repo,
  # default
  schema_name: "guardian_tokens",
  # default: 60 minutes
  sweep_interval: 60
  

вы можете использовать эту библиотеку в качестве руководства на github

Что касается создания подключаемых модулей, Guardian это тоже делает библиотека аутентификации для Elixir. Вы можете найти код здесь