【问题标题】:Devise prepend_before_filter :require_no_authentication not working设计 prepend_before_filter :require_no_authentication 不起作用
【发布时间】:2023-03-16 10:45:01
【问题描述】:

我一直在尝试将用户(登录后)重定向到上一个网址。但是我收到以下错误:

Filter chain halted as :require_no_authentication rendered or redirected

所以我在互联网上阅读了它,我发现在 Sessions Controller 中添加过滤器可以解决问题:

class SessionsController < Devise::SessionsController
  prepend_before_filter :require_no_authentication, only: [ :new, :create ]
end

但我仍然遇到同样的错误。有没有其他方法可以解决这个问题?

应用程序控制器

  after_filter :store_location

  def store_location
    # store last url - this is needed for post-login redirect to whatever the user last visited.
    if (request.fullpath != "/users/sign_in" &&
        request.fullpath != "/users/sign_up" &&
        request.fullpath != "/users/password" &&
        !request.fullpath.match("/users") &&
        !request.xhr? && # don't store ajax calls
        request.format == "text/html" || request.content_type == "text/html")
      session[:previous_url] = request.fullpath 
      session[:last_request_time] = Time.now.utc.to_i
    end
  end

  def after_sign_in_path_for(resource)
    session[:previous_url] || root_path
  end

routes.rb

  devise_for :users, :controllers => { :omniauth_callbacks => "users/omniauth_callbacks", :registrations => "registrations" }, :skip => [:sessions] 
  as :user do
    get 'login' => 'devise/sessions#new', :as => :new_user_session
    post 'login' => 'devise/sessions#create', :as => :user_session
    delete 'logout' => 'devise/sessions#destroy', :as => :destroy_user_session
  end

谢谢

【问题讨论】:

    标签: ruby-on-rails devise


    【解决方案1】:

    除非您需要覆盖 Devise 的控制器,否则无需使用它们,但如果您确实需要,请删除 prepend_before_filter :require_no_authentication

    这是我用来重定向到上一个 URL 的:

    # app/controllers/application_controller.rb
    after_action :store_location
    
    # If you are requiring authentication for all your controllers you can use
    #   before_action :authenticate_user! unless: :devise_controller?
    # and disable particular actions in other controllers with
    # require_no_authentication (except on any DeviseController)
    
    
    private
    
      def after_sign_in_path_for(resource)
        stored_location_for(resource) || dashboard_path
      end
    
      def after_sign_out_path_for(resource_or_scope)
        new_user_session_path
      end
    

    还有

    # config/routes.rb
    devise_for :user
    
    authenticated :user do
      root to: 'sistema/inicio#tablero_de_mando', as: :authenticated_user_root
    end
    
    root to: 'some_controller#some_action'
    

    您可以根据天气情况在控制器上使用 authenticate_user!require_no_authentication 和 before_action/before_filter,或者您是否需要对该控制器的特定操作进行身份验证。

    更多信息herehere

    【讨论】:

      【解决方案2】:

      设计会话控制器已经为:new:create 预先添加了:require_no_authentication。在我的代码中,我有一个 save_last 方法,很像您的 store_location,在 application_controller.rb 中定义为 before_action

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多