如何在初始化程序中导入.yml文件时读取ERb?

时间:2014-08-28 17:29:10

标签: ruby-on-rails

我看到加密的AD ID登录适用于数据库但不适用于AD连接的行为。在将密码传递到各自的端​​点之前,两者都使用完全相同的代码进行解密。加密本身已确认有效。

在adauth.rb中分配ruby <%= DM::Encryption.decrypt(:staging, 'nsad;nasdnvoasidnv;asoin') %>之前是否未进行评估?

配置/ database.yml中:

#...
staging:
  adapter: jdbcmssql
  driver: net.sourceforge.jtds.jdbc.Driver
  url: 'jdbc:jtds:sqlserver://server/db;domain=DM'
  username: some_id
  password: <%= DM::Encryption.decrypt(:staging, 'nsad;nasdnvoasidnv;asoin') %>
  pool: 10
  wait-timeout: 10
#...

配置/ ad.yml:

#...
  staging:
  <<: *default
  ad.bind_id: some_id
  ad.bind_password: <%= DM::Encryption.decrypt(:staging, 'nsad;nasdnvoasidnv;asoin') %>
#...

初​​始化/ adauth.rb:

AD_CONF = YAML.load_file(Rails.root.join('config/ad.yml'))[Rails.env]

Adauth.configure do |c|
  c.domain = AD_CONF["ad.domain"]
  c.query_user = AD_CONF["ad.bind_id"]
  c.query_password = AD_CONF["ad.bind_password"]
  c.server = AD_CONF["ad.host"]
  c.base = AD_CONF["ad.user_base"]
end

1 个答案:

答案 0 :(得分:5)

您的问题有点不清楚,但您似乎怀疑在<%= ...解析YAML之前,您的YAML文件中的ERb(adauth.rb)未被评估。

只需在AD_CONF["ad.bind_password"]中打印adauth.rb的价值即可轻松找到 - 但这似乎很可能,因为您只是在调用YAML.load_file并且从不做任何事情解析ERb。如果要解析ERb,可以在Rails::Application::Configuration.database_configuration中查看Rails的工作方式。最重要的部分是:

yaml = Pathname.new(paths["config/database"].existent.first || "")
# ...snip...
YAML.load(ERB.new(yaml.read).result) || {}

按照此示例,您可以将adauth.rb中的第一行更改为以下内容:

ad_yaml_path = Rails.root.join('config/ad.yml')    # The path to the .yml file
ad_yaml      = ERB.new( ad_yaml_path.read ).result # Read the file and evaluate the ERB
ad_hash      = YAML.load(ad_yaml)                  # Parse the resulting YAML
AD_CONF = ad_hash[Rails.env]

(第一行有效,因为Rails.rootPathname对象,Pathname#join也返回路径名,而Pathname#read的工作方式类似于File#read,返回的内容为文件。)

当然,这可以缩短(你可以把它作为单行,但这很难读):

ad_yaml = ERB.new( Rails.root.join('config/ad.yml').read ).result
AD_CONF = YAML.load(ad_yaml)[Rails.env]

还有一件事: Rails 4.2,现在处于测试阶段,has a config_for method就是这样做的。除了上述内容,您只需执行此操作:

AD_CONF = Rails.application.config_for(Rails.root + 'config/ad.yml')

所以这很整洁。