ЛОГИКА КОНТРОЛЛЕРА ДЛЯ НАПРАВЛЕННЫХ
Решение от Guillermo Siliceo Trueba не будет работать с вашим действием Users::SessionsController#create
, поскольку вы не звоните в родительский класс create
действие через ключевое слово super
.
Метод create
из класса Devise::SessionsController
будет запускать respond_with
в последней строке, используя в качестве location
значениевозвращается из after_sign_in_path_for(resource)
class Devise::SessionsController < DeviseController
# POST /resource/sign_in
def create
self.resource = warden.authenticate!(auth_options)
set_flash_message!(:notice, :signed_in)
sign_in(resource_name, resource)
yield resource if block_given?
respond_with resource, location: after_sign_in_path_for(resource)
end
end
Я использую это решение в своих Users::SessionsController
для обработки html
и json
запросов, и вы можете реализоватьто же самое.
Если контроллер получает request
с форматом .json
, выполняется код между format.json do .. end
, если request
приходит с format.html
, вызывается родительский метод (я рассматриваювсе ваши сценарии).
Маршрутизатор Rails определяет формат запроса из .json
или .html
, добавленного в конце URL (например, GET https://localhost:3000/users.json
)
class Users::SessionsController < Devise::SessionsController
def create
respond_to do |format|
format.json do
self.resource = warden.authenticate!(scope: resource_name, recall: "#{controller_path}#new")
render status: 200, json: resource
end
format.html do
super
end
end
end
end
html
запрос будет перенаправлен на super
действие создания .Вам просто нужно переопределить метод def after_sign_in_path_for(resource)
от родителя как , который я делаю в моем ApplicationController
.
if resource.admin
, затем просто return rails_admin_url
из этого метода и пропустить другойв противном случае следуйте нормальному поведению и вызовите super#after_sign_in_path_for(resource)
def after_sign_in_path_for(resource)
return rails_admin_url if resource.admin
super
end
СООБЩЕНИЯ ОБ ОШИБКАХ ДЛЯ АУТЕНТИФИКАЦИИ
warned.authenticate!
сохранит внутриself.resource.errors
сообщения об ошибках.Вам просто нужно отобразить ошибки на вашем устройстве, используя json_response[:error]
и манипулируя ответом в вашем интерфейсе.
Я отображаю их в SignInScreen
Component
СИСТЕМА АУДИТОРИИ
user.generate_auth_token
user.save
Я использую simple_token_authentication
для устройства , что также позволяетВы регенерируете токен каждый раз, когда пользователь входит в систему .
Вы просто устанавливаете драгоценный камень и добавляете acts_as_token_authenticatable
в вашу user
модель .
class User < ApplicationRecord
acts_as_token_authenticable
end
Вы передаете заголовки X-User-Email
и X-User-Token
с соответствующими значениями, как объяснено в их руководстве .
Другие альтернативы simple_token_authentication