繁体   English   中英

创建自定义的设计策略

[英]Creating a custom Devise Strategy

现在已经为此战斗了一段时间,不确定为什么它不起作用。

要点是寻求将Devise与LDAP一起使用。 除了身份验证外,我不需要做任何事情,因此除了自定义策略外,我不需要使用其他任何东西。

我创建了一个基于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是一个伟大的宝石。 但是,为了编写自己的策略,您不仅必须熟悉Devise,还必须熟悉Warden源代码,并且需要在不同的地方编写很多样板代码,因此我开始研究如何使自定义更容易实现。设计并提出这个gem devise_custom_authenticatable 您可以检查它,并可能以其他方式解决您的问题。 该gem在生产代码库中用于相当繁忙的应用程序,因此经过了实践证明:)

文件路径应与名称空间匹配。 您需要添加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  
...  

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

  1. 你将不得不照顾的strategies文件夹@csi与它一起提到建立一个models文件夹,里面的模型创建ldap_authenticatable.rb 所以结构看起来像这样

     lib/devise/strategies/ldap_authenticatable.rb lib/devise/models/ldap_authenticatable.rb 
  2. 将这些行添加到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 
  3. config/initializers/devise.rb将这些行添加到顶部。

     Devise.add_module(:ldap_authenticatable, { strategy: true, controller: :sessions, model: 'devise/models/ldap_authenticatable', route: :session }) 

这应注意自定义身份验证。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM