【问题标题】:Rails Admin with Devise Admin user not working for API only app具有 Devise Admin 用户的 Rails Admin 不适用于仅 API 应用程序
【发布时间】:2019-10-26 02:19:53
【问题描述】:

我有一个仅 API 的 rails 应用,用于用户管理的 Devise 和用于来自移动应用的令牌授权的门卫。这很好用。

我还安装了 Rails Admin,用于管理我的数据库中的所有后端数据,它运行良好,我可以从浏览器使用 Rails Admin,移动应用程序通过 API 访问数据。

到目前为止,Rails 管理仪表板没有受到保护,我需要保护它,以便只有管理员可以修改数据库中的数据。

我通过此链接 https://github.com/plataformatec/devise/wiki/How-to-Setup-Multiple-Devise-User-Models 使用教程创建了另一个设计范围

但是当我输入 Rails Admin URL 时,页面会从设计重定向到 /admins/sign_in,我认为这是正确的行为,但随后出现以下错误:

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

你能给我一个关于如何使它工作的提示或建议吗?谢谢。

【问题讨论】:

  • 可以发布您的整个routes.rb 文件,我想知道您是否为 API 使用了不同的命名空间,或者您是如何处理 API 路由的。
  • 嗨@danielavila,我更新了问题并包含了完整的 routes.rb 文件。
  • @danielavila 嗨丹尼尔,我发布了整个 routes.rb 文件,你有什么可以解决问题的线索吗?感谢您的宝贵时间。

标签: ruby-on-rails api devise ruby-on-rails-5 rails-admin


【解决方案1】:

问题

正如您在日志中看到的那样,/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)

这是因为您在 API 模式下使用 Rails,而在此模式下 Rails 不再接受 HTML 请求。为了提高 API 的性能,一些中间件和模块被禁用。

问题在于 Devise 需要 HTML,因为用户被重定向到表单。

解决方案

另一种方法是使用基本身份验证(Rails 为此提供了帮助程序)。 我们通过基本身份验证(浏览器提示)获取凭据,然后我们仅使用设计来验证用户身份。最后,我们将 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 模型。

代码未经测试,但这是一个开始。

资源:

【讨论】:

  • 非常感谢,这对我的身份验证很有帮助。我只需要对valid_password helper ``` config.authenticate_with 做一点改动 # 这是一个rails 控制器助手 authenticate_or_request_with_http_basic('Login required') do |username, password| # 在这里,我们正在检查基本身份验证提供的用户名和密码 user = Admin.find_for_database_authentication(:email => username) if user && user.valid_for_authentication? { user.valid_password?(password) } sign_in :admin, user end end ```
  • 或者,如果您不想使用 Devise 或只是按照自己的方式进行身份验证,请尝试将 current_user 设置为您的用户。 ``` authenticate_or_request_with_http_basic('Login requerido') 做|用户名,密码| # 这里我们检查基本身份验证提供的用户名和密码 resource = User.find_by(email: username) # 我们使用设计助手来验证密码并登录用户 if resource.authenticate(password) #sign_in(resource , 范围: :user) @current_user = resource end end end config.current_user_method(&:current_user) ```
  • 还请记住,使用 authenticate_or_request_with_http_basic 您无法注销。 stackoverflow.com/questions/1292841/…
猜你喜欢
  • 1970-01-01
  • 2011-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多