Rails 3 アプリケーションで「Remember Me」機能を実装するためのベスト プラクティスは何ですか?
ユーザーのログイン時にセッション情報 (セッション ID + ユーザー ID) をデータベースに保存しますが、現時点ではプラグインを使用したくありません。
ポインタやコードサンプルは大歓迎です。
Rails 3 アプリケーションで「Remember Me」機能を実装するためのベスト プラクティスは何ですか?
ユーザーのログイン時にセッション情報 (セッション ID + ユーザー ID) をデータベースに保存しますが、現時点ではプラグインを使用したくありません。
ポインタやコードサンプルは大歓迎です。
Railscastsには、これを達成するためのエピソードと、 RSpec および Capybara を使用して BDD を介してこれらの機能を実装するための優れた HOWTO があります。
ユーザーのログイン時にセッション情報 (セッション ID + ユーザー ID) をデータベースに保存します
これは 1 つのアプローチであり、上記のキャストは、各User
アカウントに一意の認証トークンを発行することにより、Cookie で同じことを行っていると思います。
Railsのチュートリアルブックを読んでいて、Remember Meの実装があります
いくつかのヒントを確認できます(実装はあなたのものとは異なる場合があります)
http://ruby.railstutorial.org/book/ruby-on-rails-tutorial#sec:remember_me
これは私が remember_me を実装した方法です (以下のスニペットは認証に関するサンプル Rails アプリからのものです):
class SessionsController < ApplicationController
skip_before_filter :login_required, :only => [:new, :create]
def new
end
def create
@current_user = User.authenticate(params[:email], params[:password])
if @current_user
@current_user.track_on_login(request)
if params[:remember_me]
cookies[:remember_token] = { :value => @current_user.remember_token, :expires => 24.weeks.from_now }
else
cookies[:remember_token] = @current_user.remember_token
end
redirect_to dashboard_url, :notice => "Logged in successfully."
else
flash.now[:alert] = "Invalid login or password."
render 'new'
end
end
def destroy
current_user.track_on_logout
current_user.reset_remember_token_and_save # can't rely on the 'save_current_user_if_dirty' after_filter here
cookies.delete(:remember_token)
reset_session
redirect_to root_url, :notice => "You have been logged out."
end
end
塩なしの例:
class ApplicationController < ActionController::Base
protected
def signin!(user_id)
return unless user_id
@current_user = User.find(user_id)
self.session_user_id = @current_user.id
self.permanent_user_id = @current_user.id if session[:accept_remember_me]
end
def signout!
self.session_user_id = nil
self.permanent_user_id = nil
session[:accept_remember_me] = nil
@current_user = nil
end
def remember_me
session[:accept_remember_me] = true
end
private
def permanent_user_id
cookies.signed[:permanent_user_id]
end
def permanent_user_id= value
cookies.permanent.signed[:permanent_user_id] = value
end
def session_user_id
session[:user_id]
end
def session_user_id= value
session[:user_id] = value
end
end