创建一个自定义设计策略

一直在与此战斗一段时间,不知道为什么它不工作。

要点在于使用LDAP与Devise。 除了进行身份验证之外,我不需要执行任何操作,所以除了自定义策略之外,我不需要使用任何内容。

我创建了一个基于https://github.com/plataformatec/devise/wiki/How-To:-Authenticate-via-LDAP并据我所知,除非每次尝试运行服务器(或耙路线)我得到一个NameError

lib/devise/models.rb:88:in `const_get': uninitialized constant Devise::Models::LdapAuthenticatable (NameError)

我将错误追溯到我的app/models/user.rb

class User < ActiveRecord::Base
  devise :ldap_authenticatable, :rememberable, :trackable, :timeoutable
end

如果我删除:ldap_authenticatable然后崩溃消失,但我没有路由到user#session和登录提示无法访问。

我的支持文件:

lib/ldap_authenticatable.rb

require 'net/ldap'
require 'devise/strategies/authenticatable'

module Devise
  module Strategies
    class LdapAuthenticatable < Authenticatable

      def authenticate!
        if params[:user]
          ldap = Net::LDAP.new
          ldap.host = 'redacted'
          ldap.port = 389
          ldap.auth login, password

          if ldap.bind
            user = User.where(login: login).first_or_create do |user|
            success!(user)
          else
            fail(:invalid_login)
          end
        end
      end

      def login
        params[:user][:login]
      end

      def password
        params[:user][:password]
      end

    end
  end
end

Warden::Strategies.add(:ldap_authenticatable, Devise::Strategies::LdapAuthenticatable)

最后,在config/initializers/devise.rb

Devise.setup do |config|
  # ==> LDAP Configuration
  require 'ldap_authenticatable'
  config.warden do |manager|
    manager.default_strategies(:scope => :user).unshift :ldap_authenticatable
  end
end

我用尽了搜索,也许有人可以看到我缺少的东西。

干杯


你的lib/ldap_authenticatable.rb是在自动加载路径还是明确要求? 由于lib文件夹中的Rails 3代码不再默认自动加载。 这是解决问题的方法之一

恕我直言设计是一个伟大的宝石。 然而,为了编写自己的策略,您不仅要熟悉Devise,还要熟悉Warden源代码,并且需要在各个地方编写大量样板代码,因此我开始研究如何使自定义更容易设计并拿出这个宝石devise_custom_authenticatable。 你可以检查它,可能它会以不同的方式解决你的问题。 这个宝石用于生产代码库,用于相当繁忙的应用程序,所以它的战斗证明了:)


文件路径应该匹配命名空间。 您需要添加2级目录。

mkdir lib/devise  
mkdir lib/devise/strategies  
mv lib/ldap_authenticatable.rb lib/devise/strategies/ldap_authenticatable.rb  

既然你是命名空间

module Devise  
  module Strategies  
    class LdapAuthenticatable < Authenticatable  
...  

创建自定义策略时需要注意的几个步骤:

  • 你必须照顾strategies文件夹,就像@csi提到的一样,创建一个models文件夹,并在模型内部创建ldap_authenticatable.rb 。 所以结构看起来像这样。

    lib/devise/strategies/ldap_authenticatable.rb  
    lib/devise/models/ldap_authenticatable.rb    
    
  • 将这些行添加到lib/devise/models/ldap_authenticatable.rb

    require Rails.root.join('lib/devise/strategies/ldap_authenticatable')  
    
    module Devise  
      module Models  
        module LdapAuthenticatable  
          extend ActiveSupport::Concern  
    
        end  
      end  
    end  
    
  • config/initializers/devise.rb中将这些行添加到顶部。

    Devise.add_module(:ldap_authenticatable, {   
      strategy: true,
      controller: :sessions,
      model: 'devise/models/ldap_authenticatable',
      route: :session
    })
    
  • 这应该照顾自定义身份验证。

    链接地址: http://www.djcxy.com/p/80951.html

    上一篇: Creating a custom Devise Strategy

    下一篇: Can ~3 safely be widened automatically?