Devise — это гибкое решение аутентификации для Rails, основанное на Warden. Это:
Он состоит из 10 модулей:
Devise Wiki содержит много дополнительной информации о Devise, включая множество практических статей и ответов на наиболее часто задаваемые вопросы. Пожалуйста, просмотрите Wiki после завершения этого README:
https://github.com/heartcombo/devise/wiki
Если вы обнаружите проблему с Devise, мы хотели бы знать об этом. Однако мы просим вас ознакомиться с этими рекомендациями, прежде чем отправлять отчет об ошибке:
https://github.com/heartcombo/devise/wiki/Bug-reports
Если вы обнаружили ошибку, связанную с безопасностью, НЕ используйте систему отслеживания проблем GitHub. Отправьте электронное письмо на адрес [email protected].
Если у вас есть какие-либо вопросы, комментарии или замечания, используйте StackOverflow вместо системы отслеживания проблем GitHub:
http://stackoverflow.com/questions/tagged/devise
Устаревший список рассылки все еще можно прочитать.
https://groups.google.com/group/plataformatec-devise
Вы можете просмотреть документацию Devise в формате RDoc здесь:
http://rubydoc.info/github/heartcombo/devise/main/frames
Если вам нужно использовать Devise с предыдущими версиями Rails, вы всегда можете запустить «gem server» из командной строки после установки драгоценного камня, чтобы получить доступ к старой документации.
На GitHub доступно несколько примеров приложений, демонстрирующих различные возможности Devise с разными версиями Rails. Вы можете просмотреть их здесь:
https://github.com/heartcombo/devise/wiki/Example-Applications
Наше сообщество создало ряд расширений, которые добавляют функциональность сверх того, что включено в Devise. Посмотреть список доступных расширений и добавить свои можно здесь:
https://github.com/heartcombo/devise/wiki/Extensions
Мы надеемся, что вы рассмотрите возможность внести свой вклад в Devise. Пожалуйста, прочитайте этот краткий обзор, чтобы получить некоторую информацию о том, как начать:
https://github.com/heartcombo/devise/wiki/Contributing
Обычно вы захотите написать тесты для своих изменений. Чтобы запустить набор тестов, перейдите в каталог верхнего уровня Devise и запустите bundle install
и bin/test
. Devise работает с несколькими версиями Ruby и Rails, а также с ORM ActiveRecord и Mongoid, что означает, что вы можете запускать набор тестов с некоторыми модификаторами: DEVISE_ORM
и BUNDLE_GEMFILE
.
Поскольку Devise поддерживает как Mongoid, так и ActiveRecord, мы полагаемся на эту переменную для запуска определенного кода для каждого ORM. Значением DEVISE_ORM
по умолчанию является active_record
. Чтобы запустить тесты для Mongoid, вы можете передать mongoid
:
DEVISE_ORM=mongoid bin/test
==> Devise.orm = :mongoid
При запуске тестов для Mongoid вам понадобится работающий в вашей системе сервер MongoDB (версии 2.0 или новее).
Обратите внимание, что вывод команды покажет используемое значение переменной.
Мы можем использовать эту переменную, чтобы сообщить сборщику, какой Gemfile ему следует использовать (вместо того, который находится в текущем каталоге). Внутри каталога gemfiles у нас есть по одному файлу для каждой поддерживаемой нами версии Rails. Когда вы отправляете нам запрос на включение, может случиться так, что набор тестов сломается при использовании некоторых из них. В этом случае вы можете смоделировать ту же среду, используя переменную BUNDLE_GEMFILE
. Например, если тесты не удались при использовании Ruby 3.0.0 и Rails 6.0, вы можете сделать следующее:
rbenv shell 3.0.0 # or rvm use 3.0.0
BUNDLE_GEMFILE=gemfiles/Gemfile-rails-6-0 bundle install
BUNDLE_GEMFILE=gemfiles/Gemfile-rails-6-0 bin/test
Вы также можете объединить их оба, если тесты для Mongoid не удались:
BUNDLE_GEMFILE=gemfiles/Gemfile-rails-6-0 bundle install
BUNDLE_GEMFILE=gemfiles/Gemfile-rails-6-0 DEVISE_ORM=mongoid bin/test
Devise использует Mini Test в качестве тестовой среды.
bin/test
bin/test test/models/trackable_test.rb
bin/test test/models/trackable_test.rb:16
Если вы создаете свое первое приложение Rails, мы рекомендуем вам не использовать Devise. Devise требует хорошего понимания Rails Framework. В таких случаях мы советуем вам запустить простую систему аутентификации с нуля. Вот несколько ресурсов, которые помогут вам начать:
Как только вы укрепите свое понимание Rails и механизмов аутентификации, мы уверяем вас, что с Devise вам будет очень приятно работать. ?
Devise 4.0 работает с Rails 6.0 и более поздних версий. Бегать:
bundle add devise
Далее необходимо запустить генератор:
rails generate devise:install
На этом этапе в консоли появится ряд инструкций. Среди этих инструкций вам нужно будет настроить параметры URL-адреса по умолчанию для почтовой программы Devise в каждой среде. Вот возможная конфигурация config/environments/development.rb
:
config . action_mailer . default_url_options = { host : 'localhost' , port : 3000 }
Генератор установит инициализатор, который описывает ВСЕ параметры конфигурации Devise. Крайне важно , чтобы вы взглянули на него. Когда вы закончите, вы готовы добавить Devise в любую из ваших моделей с помощью генератора.
В следующей команде вы замените MODEL
именем класса, используемым для пользователей приложения (часто это User
, но также может быть Admin
). Это создаст модель (если она не существует) и настроит ее с использованием модулей Devise по умолчанию. Генератор также настраивает ваш файл config/routes.rb
так, чтобы он указывал на контроллер Devise.
rails generate devise MODEL
Затем проверьте МОДЕЛЬ на наличие дополнительных параметров конфигурации, которые вы можете добавить, например подтверждаемые или блокируемые. Если вы добавляете опцию, обязательно проверьте файл миграции (созданный генератором, если ваш ORM поддерживает их) и раскомментируйте соответствующий раздел. Например, если вы добавите в модель параметр «Подтверждаемый», вам потребуется раскомментировать раздел «Подтверждаемый» в процессе миграции.
Затем запустите rails db:migrate
Вам следует перезапустить приложение после изменения параметров конфигурации Devise (включая остановку Spring). В противном случае вы столкнетесь со странными ошибками, например, пользователи не смогут войти в систему, а маршрутизация помощников будет неопределена.
Devise создаст несколько помощников для использования внутри ваших контроллеров и представлений. Чтобы настроить контроллер с аутентификацией пользователя, просто добавьте это before_action (при условии, что ваша модель устройства — «Пользователь»):
before_action :authenticate_user!
Для Rails 5 обратите внимание, что protect_from_forgery
больше не добавляется в начало цепочки before_action
, поэтому, если вы установили authenticate_user
перед protect_from_forgery
, ваш запрос приведет к «Невозможно проверить подлинность токена CSRF». Чтобы решить эту проблему, либо измените порядок их вызова, либо используйте protect_from_forgery prepend: true
.
Если ваша модель устройства отличается от модели «Пользователь», замените «_user» на «_yourmodel». Та же логика применима и к инструкциям ниже.
Чтобы проверить, вошел ли пользователь в систему, используйте следующий помощник:
user_signed_in?
Для текущего вошедшего пользователя доступен этот помощник:
current_user
Вы можете получить доступ к сеансу для этой области:
user_session
После входа пользователя, подтверждения учетной записи или обновления пароля Devise будет искать корневой путь с ограниченной областью действия для перенаправления. Например, при использовании ресурса :user
будет использоваться user_root_path
, если он существует; в противном случае будет использоваться root_path
по умолчанию. Это означает, что вам нужно установить корень внутри ваших маршрутов:
root to : 'home#index'
Вы также можете переопределить after_sign_in_path_for
и after_sign_out_path_for
чтобы настроить перехватчики перенаправления.
Обратите внимание: если ваша модель Devise называется, например, Member
вместо User
, то доступны следующие помощники:
before_action :authenticate_member!
member_signed_in?
current_member
member_session
Метод Devise в ваших моделях также допускает некоторые параметры настройки своих модулей. Например, вы можете выбрать стоимость алгоритма хеширования с помощью:
devise :database_authenticatable , :registerable , :confirmable , :recoverable , stretches : 13
Помимо :stretches
, среди других опций вы можете определить :pepper
, :encryptor
, :confirm_within
, :remember_for
, :timeout_in
, :unlock_in
. Дополнительные сведения см. в файле инициализатора, который был создан при вызове описанного выше генератора «device:install». Этот файл обычно находится по адресу /config/initializers/devise.rb
.
API-интерфейс параметра Sanitizer изменился для Devise 4.
Предыдущие версии Devise см. https://github.com/heartcombo/devise/tree/3-stable#strong-parameters.
Когда вы настраиваете свои собственные представления, вы можете добавить в формы новые атрибуты. Rails 4 перенес очистку параметров из модели в контроллер, в результате чего Devise также решил эту проблему на контроллере.
В Devise есть всего три действия, которые позволяют передавать в модель любой набор параметров, что требует очистки. Их имена и разрешенные параметры по умолчанию:
sign_in
( Devise::SessionsController#create
) — разрешает только ключи аутентификации (например, email
)sign_up
( Devise::RegistrationsController#create
) — разрешает ключи аутентификации, а также password
и password_confirmation
account_update
( Devise::RegistrationsController#update
) — разрешает ключи аутентификации плюс password
, password_confirmation
и current_password
Если вы хотите разрешить дополнительные параметры (ленивый способ™), вы можете сделать это, используя простое действие before в вашем ApplicationController
:
class ApplicationController < ActionController :: Base
before_action :configure_permitted_parameters , if : :devise_controller?
protected
def configure_permitted_parameters
devise_parameter_sanitizer . permit ( :sign_up , keys : [ :username ] )
end
end
Вышеупомянутое работает для любых дополнительных полей, где параметры являются простыми скалярными типами. Если у вас есть вложенные атрибуты (скажем, вы используете accepts_nested_attributes_for
), вам нужно будет сообщить devise об этих вложениях и типах:
class ApplicationController < ActionController :: Base
before_action :configure_permitted_parameters , if : :devise_controller?
protected
def configure_permitted_parameters
devise_parameter_sanitizer . permit ( :sign_up , keys : [ :first_name , :last_name , address_attributes : [ :country , :state , :city , :area , :postal_code ] ] )
end
end
Devise позволяет вам полностью изменить настройки Devise по умолчанию или вызвать собственное поведение, передав блок:
Чтобы разрешить простые скалярные значения для имени пользователя и адреса электронной почты, используйте это
def configure_permitted_parameters
devise_parameter_sanitizer . permit ( :sign_in ) do | user_params |
user_params . permit ( :username , :email )
end
end
Если у вас есть флажки, обозначающие роли, которые пользователь может выполнять при регистрации, браузер отправит эти выбранные флажки в виде массива. Массив не входит в число разрешенных скаляров Strong Parameters, поэтому нам необходимо настроить Devise следующим образом:
def configure_permitted_parameters
devise_parameter_sanitizer . permit ( :sign_up ) do | user_params |
user_params . permit ( { roles : [ ] } , :email , :password , :password_confirmation )
end
end
Список разрешенных скаляров и способы объявления разрешенных ключей во вложенных хэшах и массивах см.
https://github.com/rails/strong_parameters#nested-parameters
Если у вас несколько моделей устройств, возможно, вы захотите настроить разные средства очистки параметров для каждой модели. В этом случае мы рекомендуем наследовать от Devise::ParameterSanitizer
и добавить свою логику:
class User :: ParameterSanitizer < Devise :: ParameterSanitizer
def initialize ( * )
super
permit ( :sign_up , keys : [ :username , :email ] )
end
end
А затем настройте свои контроллеры для его использования:
class ApplicationController < ActionController :: Base
protected
def devise_parameter_sanitizer
if resource_class == User
User :: ParameterSanitizer . new ( User , :user , params )
else
super # Use the default one
end
end
end
В приведенном выше примере разрешенные для пользователя параметры переопределяются :username
и :email
. Неленивый способ настройки параметров — определить фильтр «до», указанный выше, в пользовательском контроллере. В некоторых разделах ниже мы подробно рассказываем, как настраивать и настраивать контроллеры.
Мы создали Devise, чтобы помочь вам быстро разработать приложение, использующее аутентификацию. Однако мы не хотим мешать вам, когда вам нужно его настроить.
Поскольку Devise — это движок, все его представления упакованы внутри драгоценного камня. Эти представления помогут вам начать работу, но через некоторое время вы, возможно, захотите их изменить. В этом случае вам просто нужно вызвать следующий генератор, и он скопирует все представления в ваше приложение:
rails generate devise:views
Если в вашем приложении имеется более одной модели Devise (например, User
и Admin
), вы заметите, что Devise использует одни и те же представления для всех моделей. К счастью, Devise предлагает простой способ настройки представлений. Все, что вам нужно сделать, это установить config.scoped_views = true
в файле config/initializers/devise.rb
.
После этого вы сможете иметь представления на основе таких ролей, как users/sessions/new
и admins/sessions/new
. Если в области видимости не найдено представление, Devise будет использовать представление по умолчанию в devise/sessions/new
. Вы также можете использовать генератор для создания ограниченных представлений:
rails generate devise:views users
Если вы хотите сгенерировать только несколько наборов представлений, например, для registerable
и confirmable
модуля, вы можете передать список представлений генератору с флагом -v
.
rails generate devise:views -v registrations confirmations
Если настройки на уровне представлений недостаточно, вы можете настроить каждый контроллер, выполнив следующие действия:
Создайте свои собственные контроллеры, используя генератор, для которого требуется область действия:
rails generate devise:controllers [scope]
Если вы укажете users
в качестве области действия, контроллеры будут созданы в app/controllers/users/
. И контроллер сессий будет выглядеть так:
class Users :: SessionsController < Devise :: SessionsController
# GET /resource/sign_in
# def new
# super
# end
...
end
Используйте флаг -c
, чтобы указать один или несколько контроллеров, например: rails generate devise:controllers users -c sessions
Скажите маршрутизатору использовать этот контроллер:
devise_for :users , controllers : { sessions : 'users/sessions' }
Рекомендуется, но не обязательно: скопируйте (или переместите) представления из devise/sessions
в users/sessions
. Rails продолжит использовать представления из devise/sessions
из-за наследования, если вы пропустите этот шаг, но наличие представлений, соответствующих контроллеру(ам), обеспечивает согласованность.
Наконец, измените или расширьте желаемые действия контроллера.
Вы можете полностью переопределить действие контроллера:
class Users :: SessionsController < Devise :: SessionsController
def create
# custom sign-in code
end
end
Или вы можете просто добавить к нему новое поведение:
class Users :: SessionsController < Devise :: SessionsController
def create
super do | resource |
BackgroundWorker . trigger ( resource )
end
end
end
Это полезно для запуска фоновых заданий или регистрации событий во время определенных действий.
Помните, что Devise использует флэш-сообщения, чтобы сообщить пользователям, был ли вход в систему успешным или неудачным. Devise ожидает, что ваше приложение вызовет flash[:notice]
и flash[:alert]
соответствующим образом. Не печатайте весь флэш-хэш, печатайте только определенные ключи. В некоторых случаях Devise добавляет к флэш-хешу ключ :timedout
, который не предназначен для отображения. Удалите этот ключ из хеша, если вы собираетесь распечатать весь хэш.
Devise также поставляется с маршрутами по умолчанию. Если вам нужно их настроить, вы, вероятно, сможете сделать это с помощью метода devise_for. Он принимает несколько параметров, таких как :class_name, :path_prefix и т. д., включая возможность изменения имен путей для I18n:
devise_for :users , path : 'auth' , path_names : { sign_in : 'login' , sign_out : 'logout' , password : 'secret' , confirmation : 'verification' , unlock : 'unblock' , registration : 'register' , sign_up : 'cmon_let_me_in' }
Обязательно ознакомьтесь с документацией devise_for
для получения подробной информации.
Если вам нужна более глубокая настройка, например, чтобы разрешить «/sign_in» помимо «/users/sign_in», все, что вам нужно сделать, это создать свои маршруты обычным образом и обернуть их в блок devise_scope
в маршрутизаторе:
devise_scope :user do
get 'sign_in' , to : 'devise/sessions#new'
end
Таким образом, вы указываете Devise использовать область :user
при доступе к «/sign_in». Обратите внимание, devise_scope
также имеет псевдоним, как as
в вашем маршрутизаторе.
Обратите внимание: вам все равно нужно будет добавить devise_for
в свои маршруты, чтобы использовать вспомогательные методы, такие как current_user
.
devise_for :users , skip : :all
Devise интегрируется с Hotwire/Turbo, обрабатывая такие запросы как навигационные и настраивая определенные ответы на ошибки и перенаправления в соответствии с ожидаемым поведением. Новые приложения по умолчанию генерируются со следующей конфигурацией ответа, а существующие приложения могут согласиться, добавив конфигурацию в свои инициализаторы Devise:
Devise . setup do | config |
# ...
# When using Devise with Hotwire/Turbo, the http status for error responses
# and some redirects must match the following. The default in Devise for existing
# apps is `200 OK` and `302 Found` respectively, but new apps are generated with
# these new defaults that match Hotwire/Turbo behavior.
# Note: These might become the new default in future versions of Devise.
config . responder . error_status = :unprocessable_entity
config . responder . redirect_status = :see_other
end
Важно : для этих пользовательских ответов требуется, чтобы версия гема responders
была 3.1.0
или выше. Обязательно обновите ее, если собираетесь использовать эту конфигурацию. Дополнительную информацию можно найти в этом руководстве по обновлению.
Примечание : приведенная выше конфигурация статусов может стать конфигурацией по умолчанию для Devise в будущем выпуске.
Есть еще пара изменений, которые вам, возможно, придется внести в ваше приложение для работы с Hotwire/Turbo, если вы переходите с рельсов-ujs:
data-confirm
, которая добавляет модальное подтверждение к кнопкам/формам перед отправкой, необходимо изменить на data-turbo-confirm
, чтобы Turbo обрабатывал их соответствующим образом.data-method
, которая устанавливает метод запроса для отправки ссылок, необходимо изменить на data-turbo-method
. Это не обязательно для button_to
или form
s, поскольку Turbo может справиться с ними. Если вы настраиваете Devise для выхода через :delete
и используете ссылки (вместо кнопок, заключенных в форму) для выхода с помощью параметра method: :delete
, их необходимо будет обновить, как описано выше. (Device не предоставляет ссылки/кнопки выхода в общих представлениях.)
Обязательно проверяйте свои представления в поисках их и вносите соответствующие изменения.
Devise использует флэш-сообщения с I18n в сочетании с флэш-клавишами :notice и :alert. Чтобы настроить свое приложение, вы можете настроить файл локали:
en :
devise :
sessions :
signed_in : ' Signed in successfully. '
Вы также можете создавать отдельные сообщения на основе настроенного вами ресурса, используя единственное имя, указанное в маршрутах:
en :
devise :
sessions :
user :
signed_in : ' Welcome user, you are signed in. '
admin :
signed_in : ' Hello admin! '
Почтовая программа Devise использует аналогичный шаблон для создания тем сообщений:
en :
devise :
mailer :
confirmation_instructions :
subject : ' Hello everybody! '
user_subject : ' Hello User! Please confirm your email '
reset_password_instructions :
subject : ' Reset instructions '
Взгляните на наш файл локали, чтобы проверить все доступные сообщения. Вас также может заинтересовать один из многих переводов, доступных на нашей вики:
https://github.com/heartcombo/devise/wiki/I18n
Внимание: Контроллеры устройств наследуются от ApplicationController. Если ваше приложение использует несколько локалей, обязательно установите I18n.locale в ApplicationController.
Devise включает в себя несколько помощников по тестированию контроллеров и интеграционных тестов. Чтобы использовать их, вам необходимо включить соответствующий модуль в ваши тестовые примеры/спецификации.
Тесты контроллера требуют включения Devise::Test::IntegrationHelpers
в ваш тестовый пример или его родительский суперкласс ActionController::TestCase
. Для версий Rails до 5 вместо этого включите Devise::Test::ControllerHelpers
, поскольку суперкласс для тестов контроллера был изменен на ActionDispatch::IntegrationTest (более подробную информацию см. в разделе Интеграционные тесты).
class PostsControllerTest < ActionController :: TestCase
include Devise :: Test :: IntegrationHelpers # Rails >= 5
end
class PostsControllerTest < ActionController :: TestCase
include Devise :: Test :: ControllerHelpers # Rails < 5
end
Если вы используете RSpec, вы можете поместить следующее в файл с именем spec/support/devise.rb
или в свой spec/spec_helper.rb
(или spec/rails_helper.rb
если вы используете rspec-rails
):
RSpec . configure do | config |
config . include Devise :: Test :: ControllerHelpers , type : :controller
config . include Devise :: Test :: ControllerHelpers , type : :view
end
Просто убедитесь, что это включение сделано после директивы require 'rspec/rails'
.
Теперь вы готовы использовать методы sign_in
и sign_out
в тестах вашего контроллера:
sign_in @user
sign_in @user , scope : :admin
Если вы тестируете внутренние контроллеры Devise или контроллер, который наследуется от Devise, вам необходимо сообщить Devise, какое сопоставление следует использовать, перед запросом. Это необходимо, поскольку Devise получает эту информацию от маршрутизатора, но поскольку тесты контроллера не проходят через маршрутизатор, это необходимо указать явно. Например, если вы тестируете область действия пользователя, просто используйте:
test 'GET new' do
# Mimic the router behavior of setting the Devise scope through the env.
@request . env [ 'devise.mapping' ] = Devise . mappings [ :user ]
# Use the sign_in helper to sign in a fixture `User` record.
sign_in users ( :alice )
get :new
# assert something
end
Помощники по интеграционному тестированию доступны путем включения модуля Devise::Test::IntegrationHelpers
.
class PostsTests < ActionDispatch :: IntegrationTest
include Devise :: Test :: IntegrationHelpers
end
Теперь вы можете использовать следующие методы sign_in
и sign_out
в своих интеграционных тестах:
sign_in users ( :bob )
sign_in users ( :bob ) , scope : :admin
sign_out :user
Пользователи RSpec могут включить модуль IntegrationHelpers
в свои спецификации :feature
.
RSpec . configure do | config |
config . include Devise :: Test :: IntegrationHelpers , type : :feature
end
В отличие от тестов контроллера, интеграционные тесты не требуют предоставления значения env
devise.mapping
, поскольку сопоставление можно определить по маршрутам, которые выполняются в ваших тестах.
Вы можете прочитать больше о тестировании ваших контроллеров Rails с помощью RSpec в вики:
В Devise встроена поддержка OmniAuth для аутентификации у других провайдеров. Чтобы использовать его, просто укажите конфигурацию OmniAuth в config/initializers/devise.rb
:
config . omniauth :github , 'APP_ID' , 'APP_SECRET' , scope : 'user,public_repo'
Подробнее о поддержке OmniAuth можно прочитать в вики:
Devise позволяет вам настроить столько моделей Devise, сколько вы хотите. Если вы хотите иметь модель администратора только с функциями аутентификации и тайм-аута в дополнение к модели пользователя, указанной выше, просто запустите:
# Create a migration with the required fields
create_table :admins do | t |
t . string :email
t . string :encrypted_password
t . timestamps null : false
end
# Inside your Admin model
devise :database_authenticatable , :timeoutable
# Inside your routes
devise_for :admins
# Inside your protected controller
before_action :authenticate_admin!
# Inside your controllers and views
admin_signed_in?
current_admin
admin_session
Альтернативно вы можете просто запустить генератор Devise.
Имейте в виду, что у этих моделей будут совершенно разные маршруты. Они не используют и не могут использовать один и тот же контроллер для входа, выхода и т. д. Если вы хотите, чтобы разные роли выполняли одни и те же действия, мы рекомендуем вам использовать ролевой подход, предоставив столбец роли или используя выделенный драгоценный камень для авторизации.
Если вы используете Active Job для доставки сообщений Action Mailer в фоновом режиме через серверную часть, вы можете отправлять электронные письма Devise через существующую очередь, переопределив метод send_devise_notification
в вашей модели.
def send_devise_notification ( notification , * args )
devise_mailer . send ( notification , self , * args ) . deliver_later
end
Если вы включите модуль «Восстанавливаемый», обратите внимание, что украденный токен сброса пароля может предоставить злоумышленнику доступ к вашему приложению. Devise прилагает усилия для генерации случайных, безопасных токенов и сохраняет в базе данных только дайджесты токенов, а не открытый текст. Однако поведение ведения журнала по умолчанию в Rails может привести к утечке токенов открытого текста в файлы журналов:
deliver_later
для отправки электронных писем о сбросе пароля, токены сброса пароля будут утеряны. Rails по умолчанию устанавливает уровень производственного логгера на INFO. Рассмотрите возможность изменения уровня производственного журнала на WARN, если вы хотите предотвратить утечку токенов в ваши журналы. В config/environments/production.rb
:
config . log_level = :warn
Девайс поддерживает ActiveRecord (по умолчанию) и Mongoid. Чтобы выбрать другой ORM, просто запросите его в файле инициализатора.
Rails 5+ имеет встроенный режим API, который оптимизирует Rails для использования только в качестве API. Devise в некоторой степени способен обрабатывать приложения, созданные в этом режиме, без дополнительных модификаций в том смысле, что он не должен вызывать исключений и тому подобного. Но некоторые проблемы все же могут возникнуть во время development
/ testing
, поскольку мы до сих пор не знаем всей степени этой совместимости. (Подробнее см. в выпуске № 4947.)
Приложения, использующие только API, не поддерживают аутентификацию на основе браузера с помощью файлов cookie, которая используется в устройстве по умолчанию. Тем не менее, в таких случаях devise все равно может обеспечить аутентификацию «из коробки» с помощью стратегии http_authenticatable
, которая использует базовую аутентификацию HTTP и аутентифицирует пользователя при каждом запросе. (Для получения дополнительной информации см. эту вики-статью «Как использовать базовую аутентификацию HTTP»).
По умолчанию в устройстве HTTP Auth отключен, поэтому его необходимо включить в инициализаторе устройства для стратегии базы данных:
config . http_authenticatable = [ :database ]
Это ограничение не ограничивает вас в реализации пользовательских стратегий защиты ни в вашем приложении, ни с помощью расширений на основе драгоценных камней для разработки. Распространенной стратегией аутентификации для API является аутентификация на основе токенов. Дополнительные сведения о расширении devise для поддержки этого и других типов аутентификации см. в статье вики «Примеры и альтернативы простой аутентификации по токену» или в этой записи блога о пользовательских методах аутентификации с помощью Devise.
Режим API меняет порядок стека промежуточного программного обеспечения, и это может вызвать проблемы для Devise::Test::IntegrationHelpers
. Эта проблема обычно проявляется в виде undefined method `[]=' for nil:NilClass
при использовании помощников интеграционного теста, таких как #sign_in
. Решение состоит в том, чтобы просто изменить порядок промежуточных программ, добавив в test.rb следующее:
Rails . application