【问题标题】:Programmatically access Devise LDAP config in Rails在 Rails 中以编程方式访问设计 LDAP 配置
【发布时间】:2015-05-04 18:39:49
【问题描述】:

我在 Rails 4 应用程序中使用带有 LDAP 身份验证的 Devise。 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 实际使用的“实时”值将会不同。

如何获得这些“实时”值?我在这方面找不到任何东西。

【问题讨论】:

  • Devise.ldap_config 在您的控制台上工作吗?还有User.ldap_config?另外,我认为直接访问yaml 文件没有什么大问题:如果您更改该值,无论如何都需要重新启动服务器!
  • @dgilperez: Devise.ldap_config 给出 nil 并且 User.ldap_config 不存在。是的,这没什么大不了的,但它的某些东西让我很烦。
  • Devise::LDAP::Connection.new.ldap 怎么样?那应该可以让您访问Devise::LDAP::Connection.new.ldap.hostDevise::LDAP::Connection.new.ldap.port 等等。

标签: ruby-on-rails-4 devise ldap


【解决方案1】:

您可以使用以下方式访问配置:

> 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"

【讨论】:

  • 这适用于大多数属性。对于admin_useradmin_password,这并不简单。 Devise::LDAP::Connection.new.ldapNet::LDAP 类型(如您在输出中看到的那样),浏览 Net::LDAP 的源代码会发现它将名称/密码存储在 @auth 中(也如上所示)。但是由于@auth 不是公开的,因此获得它的唯一方法是有点聪明(例如this answer)。
  • 我明白了。太hacky了。我只是将这种方法用于可见的东西,然后恢复到文件以进行身份​​验证设置。或者只是像我的更新中那样使用初始化器+常量。
猜你喜欢
  • 2010-12-13
  • 1970-01-01
  • 1970-01-01
  • 2012-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-06
相关资源
最近更新 更多