2011-01-23 8 views
3

私は会社がそのWebページのいくつかを更新できるようにするRails 3サイトを作成しています。AuthLogicを使用してユーザ&をログアウトしました。Rails 3でSSL接続を強制するにはどうしたらいいですか?ただし、ユーザーがログインしているときのみですか?

私たちのサイトへのトラフィックは、機密情報を送信していないため、暗号化する必要はありません。しかし、ユーザーがログインしている間は、パスワードを安全に保つために暗号化を使用することが重要だと思います。また、私が理解しているから、すべては、ユーザーがログインした時点でトラフィックを暗号化します(誰かがCookieを盗んで、それらのユーザーとして認証されないようにする)。

stackoverflowの質問は「Rails 3 SSL Deprecationは」Railsの3でSSLを使用する上でいくつかの有益な助言を持っていますが、私は、などを一度ユーザーがログインしているすべてトラフィックを暗号化する方法を理解しようとしている(あるいはログインしています。)しかし、いいえユーザーが現在ログインしていないときのトラフィック。この種の条件付きルーティングを行う方法はわかりません。

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

をしかし、これはおそらく少しやり過ぎです:

答えて

1

あなたはフィルタの前にプロトコルを確認することができます。私は、このような種類のフィルタを各リクエストで呼び出すコストはわかりません。

1

セッションをsecure => trueに設定して、HTTPSプロトコルでのみ送信されるようにする必要があります。これを行うと、(ブラウザが送信するかどうかが決まるので)すべてのトラフィックに対してsslを強制する必要はありません。セッションに依存するコントローラーまたはアクションに対してのみ、それを強制する必要があります。

HTTPSを強制するには、ssl_requirement gemのようなものを使用します。

にすべてのトラフィックを適用したい場合は、HTTPSを適用するかどうかをテストするために非セキュアなCookieを設定する必要があります。

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 
関連する問題