2011-01-23 3 views
3

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

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

StackOverflow вопрос «Rails 3 SSL Deprecation» имеет некоторые полезные советы по использованию SSL с Rails 3, но я пытаюсь выяснить, как зашифровать все трафика, когда пользователь регистрируется в (или входа в систему, и т.д. .) но no трафик, когда пользователь не вошел в систему. Я не вижу, как это сделать условной маршрутизации.

ответ

1

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

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

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

1

Вам необходимо убедиться, что вы установили сеанс: 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