创建一个自定义设计策略
一直在与此战斗一段时间,不知道为什么它不工作。
要点在于使用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