Rails3 Site Root перенаправление и Devise - могу ли я захватить начальную строку запроса URL перед перенаправлением? - PullRequest
2 голосов
/ 17 июня 2011

В моем файле rout.rb мой корневой каталог установлен так:

root :to => "portal#index"

В контроллере портала Devise выполняет шаги для аутентификации пользователя

before_filter :authenticate_user!

и перенаправляет пользователей в / users / sign_in

Все это прекрасно работает ...

Я вижу много попыток вторжения в мои журналы, которые имеют этот тип URL

example.com/?gclid=CPTKkZqfu6kCFVOFzAodLUa9-Q

Я хочу регистрировать посетителей сайта WITHIN в приложении Rails и хочу использовать эту строку, чтобы отличить реальных посетителей от попыток вторжения

Но я теряю эту строку запроса из-за перенаправления на /users/sign_in...

Есть ли способ перехватить эту начальную строку запроса в приложении Rails, кроме как в журналах веб-сервера?

Одна мысль ... Я использую Rails3, поэтому я использую Rack под капотом - могу ли я получить доступ к строке через Rack?

спасибо

Вот мой ответ на мой собственный вопрос - StackOverflow не позволяет мне публиковать ответ в течение 8 часов?!?!? но я могу отредактировать свой оригинальный вопрос ... вздох

В моем application_controller я добавил этот метод, который сохраняет текущий request.url и предыдущий в сеансе

def store_request_url_in_session
  session['request_url_prev'] = session['request_url']
  session['request_url'] = request.url
end

Затем я вызываю до моего аутентификационного вызова

before_filter :store_request_url_in_session
before_filter :authenticate_user!

Теперь это вызывается при каждом действии, но это просто назначение двух строк

В моем session_controller (подкласс от контроллера устройства по умолчанию) я добавляю этот фильтр

before_filter :log_http_request

- это то, что записывает запись в журнал, только когда текущее действие 'sign_in'

def log_http_request
  if request.url =~ /sign_in/
    logger.info("**** #{request.remote_ip} | #{session['request_url']} | #{session['request_url_prev']} ")
  end
  session.delete('request_url')
end

Это не элегантно, но дает мне то, что мне нужно прямо сейчас. Итак, попытка вторжения:

http://localhost:3000/?gclid=CPTKkZqfu6kCFVOFzAodLUa9-Q

зарегистрирован как

**** 127.0.0.1 | http://localhost:3000/users/sign_in | http://localhost:3000/?gclid=CPTKkZqfu6kCFVOFzAodLUa9-Q

Чистые решения приветствуются!

1 Ответ

0 голосов
/ 17 июня 2011

вы можете записать его в переменную сеанса, используя

session[:referer] ||= request.referer

Я не очень знаком с устройством, поэтому не могу сказать наверняка. Просто поместите это в действие index в контроллере портала.

...