我看到的行为是,加密的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.root
是Pathname对象,并且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')
所以这很整洁。