Как принудительно установить SSL-соединение с Rails 3, но только когда пользователь вошел в систему? - PullRequest
3 голосов
/ 23 января 2011

Я создаю сайт Rails 3, который позволяет компании обновлять некоторые из своих веб-страниц, и я использовал AuthLogic, чтобы позаботиться о входе и выходе пользователей.

Для большей части трафика на наш сайт нам не нужно использовать какое-либо шифрование, потому что мы не передаем конфиденциальную информацию.Однако, когда пользователь входит в систему, я считаю, что важно использовать шифрование, чтобы сохранить его пароль в безопасности.Кроме того, насколько я понимаю, важно сохранять весь трафик в зашифрованном виде после того, как пользователь вошел в систему (чтобы кто-то не украл их файлы cookie и не прошел проверку подлинности в качестве них).1007 * Rails 3 SSL Deprecation"имеет несколько полезных советов по использованию SSL с Rails 3, но я пытаюсь выяснить, как зашифровать весь трафик, как только пользовательвошел в систему (или вошел в систему и т. д.), но нет трафика, когда в данный момент не зарегистрирован ни один пользователь. Я не вижу, как сделать этот тип условной маршрутизации.

Ответы [ 2 ]

1 голос
/ 03 июня 2011

Необходимо убедиться, что вы установили сеанс: secure => true, чтобы он передавался только по протоколу HTTPS. Как только вы это сделаете, вам не нужно будет применять ssl для всего трафика (поскольку браузер определит, следует ли его отправлять). Его нужно применять только на контроллерах или действиях, которые зависят от сеанса.

Чтобы применить HTTPS, используйте что-то вроде гема ssl_requirement.

Если вы хотите применить HTTPS для всего трафика после входа пользователя, вам, вероятно, потребуется установить незащищенный файл cookie, чтобы проверить, следует ли применять HTTPS.

class ApplicationController < ActionController::Base
  def ssl_required?
    # Allow HTTP, but enforce HTTPS for users with the 'ssl' cookie set
    # current_user probably isn't needed here
    Rails.env.production? && (current_user || cookies[:ssl])
  end
end

class AccountsController < ApplicationController
  def login
    if current_user = User.authenticate(user, password)
      # This isn't required for AccountsController,
      # because it enforces HTTPS below.
      cookies[:ssl] = '1'
    end
  end

  def logout
    cookies.delete(:ssl)
  end

  # Enforce HTTPS for the Accounts controller
  def ssl_required?
    Rails.env.production?
  end
end
1 голос
/ 26 января 2011

Вы можете проверить протокол в фильтре before:

before_filter do
  unless request.protocol == 'https://'
    redirect_to 'my_page_with_https'
  end
end

Но это, возможно, немного излишне.Я не знаю стоимость вызова такого рода фильтра для каждого запроса.

...