现在已经和它斗争了一段时间,不知道它为什么不起作用。
要点是将Devise与LDAP结合使用。除了进行身份验证之外,我不需要做任何事情,所以除了自定义策略之外我不需要使用任何东西。
我基于https://github.com/plataformatec/devise/wiki/How-To:-Authenticate-via-LDAP创建了一个,据我所知,一切都应该有效,除非我尝试运行服务器(或rake路由),我得到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
我已经用尽了我的搜索,也许有人可以看到我失踪的东西。
干杯
答案 0 :(得分:2)
您的lib/ldap_authenticatable.rb
是在自动加载路径中还是明确要求?由于lib文件夹中的Rails 3代码不再默认自动加载。以下是关于如何solve it
恕我直言设计是一个伟大的宝石。然而,为了编写自己的策略,你不仅要熟悉Devise,还要熟悉Warden源代码,并且需要在不同的地方编写很多样板代码,所以我开始研究如何让Devise更容易进行自定义,并提出这个宝石devise_custom_authenticatable。你可以检查它,它可能会以不同的方式解决你的问题。这个gem在生产代码库中用于相当繁忙的应用程序,所以它经过验证:)
答案 1 :(得分:2)
文件路径应与命名空间匹配。您需要添加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
...
答案 2 :(得分:0)
创建自定义策略时需要注意的几个步骤:
您必须像@csi一样处理strategies
文件夹,并创建一个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
})
这应该照顾自定义身份验证。