#elixir #metaprogramming #phoenix-framework #ecto
#elixir #метапрограммирование #phoenix-framework #ecto
Вопрос:
Я пытаюсь создать простую систему аутентификации в elixir / phoenix, которую можно использовать в качестве зависимости в любом приложении phoenix.
Я выполнил шаги, описанные в programming-phoenix-1.4
книге, и достаточно легко настроил базовую систему аутентификации.
В этой книге рассказывается о разделении конфиденциальной и нечувствительной информации пользователя в разные места в приложении и базе данных. Вся конфиденциальная информация (имя пользователя и т.д.) помещается в users
таблицу, В то время как конфиденциальная информация (электронная почта, пароль и т.д.) помещается в credentials
таблицу.
Исходя из этого, я подумал, можно ли было бы выделить логику аутентификации в ее собственное приложение.
Этому модулю аутентификации потребуется:
- создайте
credentials
таблицу в базе данных требуемого приложения - обновите указанную таблицу на основе информации, переданной из родительского приложения
- содержит,
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. Вы можете найти код здесь