我看到加密的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
答案 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.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,现在处于测试阶段,has a config_for
method就是这样做的。除了上述内容,您只需执行此操作:
AD_CONF = Rails.application.config_for(Rails.root + 'config/ad.yml')
所以这很整洁。