Không bao giờ mã hóa thông tin nhạy cảm (thông tin đăng nhập tài khoản, mật khẩu, v.v.) . Thay vào đó, hãy tạo một tệp để lưu trữ thông tin đó dưới dạng các biến môi trường (cặp khóa / giá trị) và loại trừ tệp đó khỏi hệ thống quản lý mã nguồn của bạn. Ví dụ: về mặt Git (hệ thống quản lý mã nguồn), hãy loại trừ tệp đó bằng cách thêm tệp đó vào. gitignore :
-bash> echo '/config/app_environment_variables.rb' >> .gitignore
/config/app_enosystem_variables.rb
ENV['HTTP_USER'] = 'devuser'
ENV['HTTP_PASS'] = 'devpass'
Ngoài ra, hãy thêm các dòng sau vào /config/environment.rb
, giữa require
dòng và Application.initialize
dòng:
app_environment_variables = File.join(Rails.root, 'config', 'app_environment_variables.rb')
load(app_environment_variables) if File.exists?(app_environment_variables)
Đó là nó!
Như nhận xét ở trên nói, bằng cách làm này, bạn sẽ tải các biến môi trường của mình trước environments/*.rb
đó, có nghĩa là bạn sẽ có thể tham chiếu đến các biến của mình bên trong các tệp đó (ví dụ environments/production.rb
). Đây là một lợi thế lớn so với việc đưa tệp biến môi trường của bạn vào bên trong /config/initializers/
.
Bên trong app_environment_variables.rb
không cần phải phân biệt môi trường là phát triển hay sản xuất bởi vì bạn sẽ không bao giờ cam kết tệp này vào hệ thống quản lý mã nguồn của mình, do đó theo mặc định , nó dành cho bối cảnh phát triển . Nhưng nếu bạn cần đặt một cái gì đó đặc biệt cho môi trường thử nghiệm (hoặc cho những trường hợp bạn thử nghiệm chế độ sản xuất cục bộ ), chỉ cần thêm một khối điều kiện bên dưới tất cả các biến khác:
if Rails.env.test?
ENV['HTTP_USER'] = 'testuser'
ENV['HTTP_PASS'] = 'testpass'
end
if Rails.env.production?
ENV['HTTP_USER'] = 'produser'
ENV['HTTP_PASS'] = 'prodpass'
end
Bất cứ khi nào bạn cập nhật app_environment_variables.rb
, hãy khởi động lại máy chủ ứng dụng. Giả sử bạn đang sử dụng Apache / Passenger hoặc rails server
:
-bash> touch tmp/restart.txt
Trong mã của bạn, hãy tham khảo các biến môi trường như sau:
def authenticate
authenticate_or_request_with_http_basic do |username, password|
username == ENV['HTTP_USER'] && password == ENV['HTTP_PASS']
end
end
Lưu ý rằng bên trong app_environment_variables.rb
bạn phải chỉ định boolean và số dưới dạng chuỗi (ví dụ: ENV['SEND_MAIL'] = 'false'
không chỉ false
và ENV['TIMEOUT'] = '30'
không chỉ 30
), nếu không bạn sẽ nhận được lỗi can't convert false into String
và can't convert Fixnum into String
tương ứng.
Lưu trữ và chia sẻ thông tin nhạy cảm
Nút thắt cuối cùng để thắt chặt là: làm thế nào để chia sẻ thông tin nhạy cảm này với khách hàng và / hoặc đối tác của bạn? Vì mục đích kinh doanh liên tục (tức là khi bạn gặp phải một ngôi sao rơi, khách hàng và / hoặc đối tác của bạn sẽ tiếp tục hoạt động đầy đủ của trang web như thế nào?), Khách hàng và / hoặc đối tác của bạn cần biết tất cả thông tin đăng nhập mà ứng dụng của bạn yêu cầu . Gửi email / Skyping những thứ này xung quanh là không an toàn và dẫn đến rối loạn. Lưu trữ nó trong Google Documents được chia sẻ không phải là xấu (nếu tất cả mọi người đều sử dụng https), nhưng một ứng dụng dành riêng để lưu trữ và chia sẻ các mẩu tin nhỏ như mật khẩu sẽ là lý tưởng.
Cách đặt biến môi trường trên Heroku
Nếu bạn có một môi trường duy nhất trên Heroku:
-bash> heroku config:add HTTP_USER='herouser'
-bash> heroku config:add HTTP_USER='heropass'
Nếu bạn có nhiều môi trường trên Heroku:
-bash> heroku config:add HTTP_USER='staguser' --remote staging
-bash> heroku config:add HTTP_PASS='stagpass' --remote staging
-bash> heroku config:add HTTP_USER='produser' --remote production
-bash> heroku config:add HTTP_PASS='prodpass' --remote production
Quản đốc và .env
Nhiều nhà phát triển sử dụng Foreman (được cài đặt với Heroku Toolbelt ) để chạy các ứng dụng của họ cục bộ (trái ngược với việc sử dụng các ứng dụng như Apache / Passenger hoặc rails server
). Foreman và Heroku sử dụng Procfile
để khai báo những lệnh nào được chạy bởi ứng dụng của bạn , vì vậy việc chuyển đổi từ local dev sang Heroku là liền mạch về mặt đó. Tôi sử dụng Foreman và Heroku trong mọi dự án Rails, vì vậy sự tiện lợi này là rất tốt. Nhưng đây là vấn đề .. Foreman tải các biến môi trường được lưu trữ trong /.env
dotenv nhưng thật không may dotenv về cơ bản chỉ phân tích cú pháp tệp cho key=value
các cặp; những cặp đó không trở thành biến ngay tại đó và sau đó, vì vậy bạn không thể tham chiếu đến các biến đã đặt (để giữ cho mọi thứ KHÔ), cũng như bạn không thể làm "Ruby" trong đó (như đã lưu ý ở trên với các điều kiện), bạn có thể làm trong /config/app_environment_variables.rb
. Ví dụ, về việc giữ cho mọi thứ KHÔ, đôi khi tôi làm những việc như sau:
ENV['SUPPORT_EMAIL']='Company Support <support@company.com>'
ENV['MAILER_DEFAULT_FROM'] = ENV['SUPPORT_EMAIL']
ENV['MAILER_DEFAULT_TO'] = ENV['SUPPORT_EMAIL']
Do đó, tôi sử dụng Foreman để chạy các ứng dụng của mình cục bộ, nhưng tôi không sử dụng .env
tệp của nó để tải các biến môi trường; đúng hơn là tôi sử dụng Foreman kết hợp với /config/app_environment_variables.rb
cách tiếp cận được mô tả ở trên.
export admin_password="secret"
chứ không phảiexport admin_password = "secret"
.