2

当登录过程中出现 ldap 错误时,我想向我的登录页面显示错误消息,例如“系统此时无法让您登录。请稍后再试”。

目前,我使用了 https://github.com/plataformatec/devise/wiki/How-To:-Redirect-to-a-specific-page-when-the-user-can-中所述的 custom_failure.rb 方法未经过身份验证 ,它能够捕获诸如无效的用户名/密码之类的错误,并且我已将其重定向到登录页面,根据需要显示错误消息而没有问题。但是这种方法无法捕获 ldap 错误。

这些 ldap 错误显示为一个非常原始的 html 页面,如下所示:

Devise::SessionsController#create 中的 Errno::ETIMEDOUT

连接尝试失败,因为连接方在一段时间后没有正确响应,或者连接失败,因为连接的主机没有响应。- 连接(2)

Rails.root: C:/extratxt/2.2.0/source/ruby/messaging 应用程序跟踪 | 框架跟踪 | 全跟踪

要求

参数:

{"utf8"=>"✓",
 "user"=>{"username"=>"administrator",
 "password"=>"[FILTERED]",
 "remember_me"=>"0"},
 "commit"=>"Sign in"}

显示会话转储

显示环境转储响应

标题:

没有任何

我怎样才能防止这种情况,而是显示我指定的页面(例如带有我自己的错误消息的登录页面)?任何的想法 ?谢谢

4

1 回答 1

2

一种方法是覆盖创建会话操作,但需要几个步骤才能使其正常工作。首先,复制设计视图(如果您还没有这样做)

rails g devise:views

然后你需要创建一个扩展 Devise::SessionsController 的 sessions_controller.rb 文件:

# /app/controllers/sessions_controller.rb
class SessionsController < Devise::SessionsController

  # copied from [...]/gems/devise-1.4.5/app/controllers/sessions_controller.rb
  # To find the path to your gem, use 'bundle show devise' 
  def create

    begin
      resource = warden.authenticate!(:scope => resource_name, :recall => "#{controller_path}#new")
      set_flash_message(:notice, :signed_in) if is_navigational_format?
      sign_in(resource_name, resource)
      respond_with resource, :location => redirect_location(resource_name, resource)
    rescue Net::LDAP::LdapError
      # handle your error
      respond_to do |format|
        format.html { redirect_to new_user_session_path, :notice => $!.to_s }
        format.json { render json: $!.to_s }
      end
    end

  end
end

最后,在您的 config/routes.rb 中,您需要告诉 devise 使用您的自定义控制器:

devise_for :users, :controllers => { :sessions => :sessions }
于 2012-11-06T15:18:50.313 回答