我想覆盖devise gem的authenticate_user和current_user方法

时间:2011-06-21 12:29:40

标签: ruby ruby-on-rails-3 rubygems

我想覆盖authenticate_user!和我的应用程序控制器中的devise gem的current_user方法可以请你帮我解决这个问题 感谢

5 个答案:

答案 0 :(得分:8)

覆盖用户的身份验证方式:

Devise在引擎盖下使用Warden https://github.com/plataformatec/devise/blob/master/lib/devise/controllers/helpers.rb

因此,您只需在Warden中添加新策略即可验证您的用户身份。看到 https://github.com/hassox/warden/wiki/Strategies

您不需要覆盖current_user。你面临什么挑战? 你需要退回不同的型号吗?

答案 1 :(得分:6)

您可以像以下一样对其进行修补:

module Devise
  module Controllers
    module Helpers
      def authenticate_user!
        #do some stuff
      end
    end
  end
end   

但我会问最终的目标是什么,因为Devise已经内置了一些可定制性,并且覆盖这些方法让我想知道“为什么要使用Devise?”

答案 2 :(得分:5)

如果您想代码添加到authenticate_user!

class DuckController < ApplicationController
  before_action :authenticate_duck

  ...

  private

  def authenticate_duck
    #use Devise's method
    authenticate_user!
    #add your own stuff
    unless current_user.duck.approved?
      flash[:alert] = "Your duck is still pending. Please contact support for support."
      redirect_to :back
    end
  end
end

答案 3 :(得分:4)

您必须创建一个自定义类来覆盖默认的Devise行为:

  class CustomFailure < Devise::FailureApp
    def redirect_url
      #return super unless [:worker, :employer, :user].include?(scope) #make it specific to a scope
       new_user_session_url(:subdomain => 'secure')
    end

    # You need to override respond to eliminate recall
    def respond
      if http_auth?
        http_auth
      else
        redirect
      end
    end
  end

在你的config / initializers / devise.rb中:

  config.warden do |manager|
    manager.failure_app = CustomFailure
  end

但我建议查看Devise文档:)

https://github.com/plataformatec/devise/wiki/How-To:-Redirect-to-a-specific-page-when-the-user-can-not-be-authenticated

答案 4 :(得分:0)

application_controller.rb,您可以根据需要覆盖:

def authenticate_user!
  super # just if want the default behavior 
  call_a_method_to_something if current_user
  # or
  call_a_method_to_something if current_user.nil?
end