2

Rails 3 アプリケーションで「Remember Me」機能を実装するためのベスト プラクティスは何ですか?

ユーザーのログイン時にセッション情報 (セッション ID + ユーザー ID) をデータベースに保存しますが、現時点ではプラグインを使用したくありません。

ポインタやコードサンプルは大歓迎です。

4

5 に答える 5

3

Railscastsには、これを達成するためのエピソードと、 RSpec および Capybara を使用して BDD を介してこれらの機能を実装するための優れた HOWTO があります。

ユーザーのログイン時にセッション情報 (セッション ID + ユーザー ID) をデータベースに保存します

これは 1 つのアプローチであり、上記のキャストは、各Userアカウントに一意の認証トークンを発行することにより、Cookie で同じことを行っていると思います。

于 2011-10-05T09:07:17.400 に答える
2

Railsのチュートリアルブックを読んでいて、Remember Meの実装があります

いくつかのヒントを確認できます(実装はあなたのものとは異なる場合があります)

http://ruby.railstutorial.org/book/ruby-on-rails-tutorial#sec:remember_me

于 2011-10-05T07:38:53.843 に答える
1

これは私が 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
于 2011-12-01T18:51:27.330 に答える
0

塩なしの例:

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
于 2011-10-05T08:00:55.100 に答える