以编程方式访问 Rails 中的 Devise LDAP 配置

Programmatically access Devise LDAP config in Rails

我在 Rails 4 应用程序中使用 Devise 和 LDAP 身份验证。 ldap.yml 看起来像

development:
  host: my.ldap.server
  port: 636
  attribute: sAMAccountName
  base: OU=Accounts,DC=my,DC=ldap,DC=server
  admin_user: CN=ServiceAccount,OU=LDAP,OU=Service Accounts,DC=my,DC=ldap,DC=server
  admin_password: super_secret_password
  ssl: true

production:
  ...

我希望能够以编程方式访问它,但我不知道该怎么做。我可以通过直接从文件中读取来访问

ldap_config = YAML.load(ERB.new(File.read(::Devise.ldap_config || "#{Rails.root}/config/ldap.yml")).result)[Rails.env]

但是,这不是 100% 准确,因为如果文件中的值在 Rails 服务器未重新启动的情况下发生更改,则 Rails 实际使用的 "live" 值将与众不同。

如何获得这些 "live" 值?我在这上面找不到任何东西。

您可以使用此访问配置:

> Devise::LDAP::Connection.new.ldap
=> #<Net::LDAP:0x0000010e9d2da8
 @auth={:method=>:anonymous},
 @base="OU=Accounts,DC=my,DC=ldap,DC=server",
 @encryption={:method=>:simple_tls},
 @force_no_page=false,
 @host="my.ldap.server",
 @open_connection=nil,
 @port=636,
 @verbose=false>

> Devise::LDAP::Connection.new.ldap.host
=> "my.ldap.server"
> Devise::LDAP::Connection.new.ldap.port
=> 636
...
> 

就像我说的,我没有看到像你写的那样直接读取文件有什么麻烦。如果您更改 ldap.yml,您将需要重新启动服务器才能看到 LDAP 配置中的更改!如果您愿意,可以像这样设置初始化程序:

# config/initializers/ldap.rb
LDAP_CONFIG = YAML.load(ERB.new(File.read("#{Rails.root}/config/ldap.yml")).result)[Rails.env].with_indifferent_access

然后在您的代码中:

LDAP_CONFIG[:admin_user] #=> "CN=ServiceAccount,OU=LDAP,OU=Service Accounts,DC=my,DC=ldap,DC=server"
LDAP_CONFIG[:admin_password] #=> "super_secret_password"
LDAP_CONFIG[:host] #=> "my.ldap.server"