【问题标题】:How to catch Ldap error and redirect to specified page when using Devise and devise_ldap_authenticatable使用 Devise 和 devise_ldap_authenticable 时如何捕获 Ldap 错误并重定向到指定页面
【发布时间】:2012-11-06 23:18:50
【问题描述】:

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

目前,我使用了 custom_failure.rb 方法,如 https://github.com/plataformatec/devise/wiki/How-To:-Redirect-to-a-specific-page-when-the-user-can-not-be-authenticated 它能够捕获无效用户名/密码之类的错误,我已将其重定向到登录页面 根据需要显示错误消息,没有问题。 但是这种方法无法捕获 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"}

显示会话转储

显示环境转储 回应

标题:

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

【问题讨论】:

    标签: ruby-on-rails devise ldap


    【解决方案1】:

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

    rails g devise:views
    

    然后你需要创建一个扩展 Devise::SessionsController: 的 session_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 }
    

    【讨论】:

    • 抱歉回复晚了。最后我尝试了你的建议,效果很好。我做了以下 2 处更改:1) redirect_to :controller => 'mycontroller', :action => 'myaction', .. 2) devise_for :users, :controllers => { :sessions => "sessions" }跨度>
    • 很高兴它成功了。您可以将答案标记为“已接受的解决方案”吗? :-)
    • 是的,完成了。需要一些时间来弄清楚如何将其标记为“已接受的解决方案”。 “滴答”太容易被忽视了!
    • 这很有帮助。我要强调的是,人们应该使用他们当前版本的代码来创建覆盖,而不是盲目地复制上面的代码。
    猜你喜欢
    • 2012-01-29
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 2012-07-19
    相关资源
    最近更新 更多