Rails Admin с пользователем Devise Admin не работает только для приложения API - PullRequest
0 голосов
/ 11 июня 2019

У меня есть приложение только для API, с Devise для управления пользователями и привратником для авторизации токенов из мобильного приложения.Это отлично работает.

Я также установил Rails Admin, чтобы управлять всеми внутренними данными в моей БД, и он отлично работает, я могу работать с Rails Admin из своего браузера, а мобильное приложение получает доступ к данным через API.

Пока что панель администратора Rails не защищена, и мне нужно защитить ее, чтобы только администратор мог изменять данные из БД.

Я создал еще одну область для разработки с помощью учебника изэта ссылка https://github.com/plataformatec/devise/wiki/How-to-Setup-Multiple-Devise-User-Models

, но когда я набираю URL-адрес Rails Admin, страница перенаправляется на / admins / sign_in из devise, что, я полагаю, является правильным поведением, но затем я получаю следующую ошибку:

Started GET "/" for 186.2.132.186 at 2019-06-11 15:14:40 +0000
   (0.9ms)  SET NAMES utf8,  @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'),  @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483
  ↳ /usr/local/rvm/gems/ruby-2.5.5/gems/activerecord-5.2.3/lib/active_record/log_subscriber.rb:98
   (0.9ms)  SELECT `schema_migrations`.`version` FROM `schema_migrations` ORDER BY `schema_migrations`.`version` ASC
  ↳ /usr/local/rvm/gems/ruby-2.5.5/gems/activerecord-5.2.3/lib/active_record/log_subscriber.rb:98
Processing by RailsAdmin::MainController#dashboard as HTML
Completed 401 Unauthorized in 10ms (ActiveRecord: 0.0ms)


Started GET "/admins/sign_in" for 186.2.132.186 at 2019-06-11 15:14:40 +0000
Processing by Admins::SessionsController#new as HTML
Completed 406 Not Acceptable in 16ms (ActiveRecord: 3.2ms)



ActionController::UnknownFormat (ActionController::UnknownFormat):

responders (2.4.1) lib/action_controller/respond_with.rb:213:in `respond_with'
devise (4.6.2) app/controllers/devise/sessions_controller.rb:14:in `new'

...more stack

В инициализаторе Rails ADmin я добавил следующий код:

  ## == Devise ==
  config.authenticate_with do
    warden.authenticate! scope: :admin
  end
  config.current_user_method(&:current_admin)

Это мои маршруты:

#require 'api_constraints.rb'
Rails.application.routes.draw do

  use_doorkeeper do
   # No need to register client application
    skip_controllers :applications, :authorized_applications, :admins
  end

  #devise_for :admins, path: 'admins'
  devise_for :admins, controllers: {
          sessions: "admins/sessions",
          #registrations: 'admins/registrations',
      }, skip: [:registrations]

  mount RailsAdmin::Engine => '/', as: 'rails_admin'

  #devise_for :users
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
  scope module: :api, defaults: { format: :json }, path: 'api' do
    scope module: :v1 do
      devise_for :users, controllers: {
           registrations: 'api/v1/users/registrations',
       }, skip: [:sessions, :password]
    end
  end

   #Rutas para acceder al API
  #scope '/api' do
  namespace :api do
    namespace :v1 do
      resources :users
      resources :ejercicios
      resources :medidas
      resources :profiles
      resources :categoria_ejercicio
    end
  end

  root to: 'home#index'
end

Я также включил представления Devise для администратора с этимкоманда

rails g devise: views admins

Можете ли вы дать мне подсказку или предложение о том, как заставить это работать.Спасибо.

1 Ответ

0 голосов
/ 23 июня 2019

Проблема

Как видно из журналов, путь /admin/sign_in отклонен с ошибкой 406 Not Acceptable http, что означает, что запрошенный формат (HTML) не принят.

Started GET "/admins/sign_in" for 186.2.132.186 at 2019-06-11 15:14:40 +0000
Processing by Admins::SessionsController#new as HTML
Completed 406 Not Acceptable in 16ms (ActiveRecord: 3.2ms)

Это происходит потому, что вы используете Rails в режиме API, и в этом режиме Rails больше не принимает запросы HTML.Некоторые промежуточные программы и модули отключены для улучшения производительности для API.

Проблема в том, что Devise требует HTML, поскольку пользователи перенаправляются на формы.

Решение

Другой подходсостоит в том, чтобы использовать обычную аутентификацию (для этого в Rails есть помощники).Мы получаем учетные данные с помощью базовой аутентификации (приглашение браузера), затем мы используем Devise только для аутентификации пользователя.Наконец, мы настроили Rails Admin для использования этой стратегии.

# rails admin configuration, replacing your existing config
config.authenticate_with do
  # this is a rails controller helper
  authenticate_or_request_with_http_basic('Login required') do |username, password|

    # Here we're checking for username & password provided with basic auth
    resource = Admin.find_by(email: username)

    # we're using devise helpers to verify password and sign in the user 
    if resource.valid_password?(password)
      sign_in :admin, resource
    end
  end
end

Примечание: вам, возможно, придется адаптировать линию resource = с вашими моделями.Я предполагаю, что у вас уже есть модель Admin.

Код не проверен, но это только начало.

Ресурсы:

...