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

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

config / 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
#...


config / 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

最佳答案

您的问题尚不清楚,但似乎您怀疑在<%= ...中解析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(现在处于beta版)has a config_for method正是这样做的。除了上述内容,您只需执行以下操作:

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


所以这很整洁。

10-05 21:35