簡體   English   中英

設計authenticate_admin_user! 升級到 rails 5 后不起作用

[英]Devise authenticate_admin_user! does not work after upgrading to rails 5

我有一個舊的、相當大的 Rails 應用程序,我需要升級到當前版本。 它目前在 Rails 4.2.11 上運行。 我現在已經成功升級了我所有的 gem,所以它運行 Rails 5.0.7 版。 而且我處於應用程序再次啟動並且大部分工作的狀態。 這樣做時,我已將設計 gem 從 3.4.0 版升級到 4.0.0,但我也嘗試了 4.7.3。 這對我的問題沒有影響。

唯一不能正常工作的是身份驗證。 我可以加載登錄屏幕並使用用戶登錄。 登錄成功,但隨后我被重定向回主應用程序頁面,而不是受保護的資源。

據我所知,Devise 會話並沒有保留在會話中,但我不明白為什么它不起作用。 我在日志中沒有收到任何錯誤。 當我請求受保護的資源時,日志顯示初始 401 錯誤,我們將被重定向到登錄表單(如預期)。 成功登錄后(我看到數據庫中的 sign_in_count 增加),重定向到主頁,而不是受保護的資源。

我已將以下代碼添加到主頁控制器的 index 方法中(我被重定向到該方法):

class MainController < ApplicationController
  def index
    puts "Current Admin User: #{current_admin_user} nil: #{current_admin_user.nil?} signedIn: #{admin_user_signed_in?}"

   # rest of the code omitted for simplicity
  end
end

輸出如下:

web_1 | [pid: 1] [c48b7285-3f9e-4cb7-94ba-64b6c9d9bd0e] Processing by MainController#index as HTML
web_1 | Current User:  is nil: true signed_in: false

(簡化的)routes.rb 文件如下所示:

root 'main#index'
devise_for :admin_users

namespace :admin do
  constraints(CheckIp.new) do
    devise_scope :admin_user do # a
      root to: '/admin/main#index' # b
      
      resources :main_admin, path: :main do
        ... # contains sub resources
      end
    end
  end
end

我在升級后添加了 a 和 b 行,希望它能解決我的問題,但我看不出任何區別。 我的理解是設計 4 應該重定向到我的范圍內的根(b 行),但這並沒有發生。 我還嘗試在約束檢查之前移動 a 行,並在 admin 命名空間之前再次移動。 結果在所有情況下都是相同的。

路由按定義的順序具有優先級。

由於root 'main#index'是在文件頂部定義的,Rails 在到達帶有約束的第二條路由之前就已經匹配了對/的請求。

您所要做的就是將默認路由移動到約束之下:

devise_for :admin_users

namespace :admin do
  constraints(CheckIp.new) do
    devise_scope :admin_user do # a
      root to: '/admin/main#index' # b
      
      resources :main_admin, path: :main do
        ... # contains sub resources
      end
    end
  end
end

root 'main#index'

如果約束或devise_scope沒有產生匹配的路由,那么它就會“ devise_scope

我終於找到了我的問題的原因。 我對中間件堆棧進行了一些修改以進行日志標記,如下所示:

Rails.configuration.middleware.delete(ActionDispatch::Cookies)
Rails.configuration.middleware.delete(ActionDispatch::Session::CookieStore)
Rails.configuration.middleware.insert_before(Rails::Rack::Logger, ActionDispatch::Session::CookieStore)   
Rails.configuration.middleware.insert_before(ActionDispatch::Session::CookieStore, ActionDispatch::Cookies)

這不再起作用。 因此,我暫時刪除了日志標記,因為身份驗證更為重要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM