Rails — получение remote_user для возврата имени пользователя из apache

#ruby-on-rails #apache

#ruby-on-rails #apache

Вопрос:

Я немного осмотрелся и нашел некоторую информацию по этой теме, но не смог заставить ее работать. У меня есть apache / tomcat, установленный на моем веб-сервере в моей компании. Ранее на том же веб-сервере, когда я писал CGI-приложения, мне удалось успешно получить имя пользователя посетителей на моем сайте, обратившись к среде var REMOTE_USER. Теперь, когда я езжу на rails, переменная request.env[‘REMOTE_USER’] ничего не возвращает.

Пожалуйста, обратите внимание, что я не использую Mongrel, как предполагают многие онлайн-обсуждения. Кроме того, я не собираюсь создавать систему аутентификации, я просто хочу прочитать (используя REMOTE_USER) имя пользователя людей, которые заходят на мой сайт.

Я знаю, что мне нужно будет настроить мой файл .htaccess (расположенный в моей общей папке), чтобы переслать эту информацию из apache в мое приложение. Посмотрев примеры в Интернете, я изменил его на..

 RewriteCond %{REMOTE_USER} (. )
RewriteRule ^.*$ - [E=RU:%1]
RequestHeader add X-Forwarded-User %{RU}e
  

.. но это не помогло. Спасибо.

Ответ №1:

Если вы добавляете X-Forwarded-User, вам нужно прочитать request.headers[‘X-Forwarded-User’], а не request.env[‘REMOTE_USER’] .

Поместите это в файл ниже и используйте http_remote_user вместо хэша request.env.

 # app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  def http_remote_user
    request.env['HTTP_REMOTE_USER'] || request.headers['X-Forwarded-User']
  end
  helper_method :http_remote_user
end
  

Комментарии:

1. Спасибо за ответ @squarsim. Вставил код в свой контроллер приложений и, на мой взгляд, попытался напечатать оба, <%= http_remote_user %> и <%= request.headers[‘X-Forwarded-User’] %> .. все еще выдаю пустой. Может быть, мне нужно добавить / изменить что-то в моем .htaccess?

2. Распечатайте <%= request.headers %> это будет полный набор заголовков, с которыми rails может работать, если вы его не видите, значит, на стороне apache чего-то не хватает.

3. Распечатал request.headers и получил загрузку страницы с информацией. Однако REMOTE_USER отсутствовал в выводе. Означает ли это, что мне нужно включить со стороны Apache?

4. Если apache видит REMOTE_USER=bob, а вы нигде не видите bob в request.headers, то apache ничего не пересылает, и rails ничего не может с этим поделать. Так что да, я бы поиграл с файлом .htaccess.

Ответ №2:

Я боролся с этим, но, наконец, заставил его работать.

  1. Убедитесь, что вы не забыли добавить RewriteEngine On в файл conf (для меня это было внутри VirtualHost раздела), я забыл, и он молча потерпел неудачу, никаких ошибок при перезапуске apache.

  2. В зависимости от того, используете ли вы файл .htaccess или .conf, вам необходимо изменить правило RewriteCond . Эзотерические подробности — примечание 5 означает, что нам нужно использовать RewriteCond %{LA-U:REMOTE_USER} (. ) , если мы находимся внутри файла conf.

  3. Чтобы помочь в отладке, вы всегда можете начать с использования RequestHeader add X-Forwarded-User 'FixedValue' , чтобы убедиться, что проблемы связаны с apache, а не с rails или другими промежуточными продуктами.