开发者

Redirecting issues when user cannot sign in using Devise

开发者 https://www.devze.com 2023-01-25 06:07 出处:网络
In my application I authenticate users using Devise and I noticed that you can change the page that one is redirected to if the sign in fails. On the wiki I found the following example:

In my application I authenticate users using Devise and I noticed that you can change the page that one is redirected to if the sign in fails. On the wiki I found the following example:

class CustomFailure < Devise::FailureApp
  def redirect_url
    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

Following this example I created my own CustomFailure class(custom_failure.rb) and placed in the helper folder (not sure where to put it). This is the following class I created:

class CustomFailure < Devise::FailureApp
  def redirect_url
    new_user_session_url(:subdomain => 'secure')
  end

  # Redirect to root_url
  def respond
    if http_auth?
      http_auth
    else
      root_url
    end
  end
end

I also added the following in the config/initializers/devise.rb file (as the wiki states should be done):

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

Although I get no errors, when I incorrectly sign in it still redirects to the /users/sign_in page (not the root page) and nothing is loaded (the page is completely white even though the source is not empty). Is there comthing wrong with my CustomFailure class or maybe it is in the wrong folder?

I am using Rails 3.0.1 and Devise 1.1.rc0.

The wiki where this code is found is at: How To: Redirect to a specific page when the user can not be authenticated


Try putting custom_failure.rb into you lib folder as it is not a helper. Then make sure the file is loaded. Probably you would attempt to load all files in lib automatically.

EDIT: To achieve an auto loaded lib you would insert the following to your application.rb:

config.autoload_paths += %W(#{config.root}/lib)

EDIT2: you forgot to call redirect_to when trying to redirect. At the moment respond only returns root_url. Try this:

def respond
  if http_auth?
    http_auth
  else
    redirect_to root_url
  end
end

fyi: the devise-guys also perform this before redirecting:

store_location!
flash[:alert] = i18n_message unless flash[:notice]
0

精彩评论

暂无评论...
验证码 换一张
取 消