Как реализовать функцию «Запомнить меня» в Rails 3? - PullRequest
2 голосов
/ 05 октября 2011

Каковы лучшие практики для реализации функции "Запомнить меня" в приложении Rails 3?

Я сохраняю информацию о сеансе (идентификатор сеанса + идентификатор пользователя) в базе данных, когда пользователь входит в систему, и я не хочу сейчас использовать какие-либо плагины.

Любые указатели или примеры кода будут высоко ценится.

Ответы [ 5 ]

8 голосов
/ 02 мая 2015

Вы можете просто установить срок действия подписанного файла cookie, чтобы выполнить это.(Подписанные файлы cookie защищены от несанкционированного доступа, как и файлы cookie session, предоставляемые Rails.)

class SessionsController < ApplicationController

  def create
    ...
    user = User.authenticate(params[:email_address], params[:password])

    if params[:remember_me]
      cookies.signed[:user_id] = { value: user.id, expires: 2.weeks.from_now }
    else
      # expires at the end of the browser session
      cookies.signed[:user_id] = user.id
    end
  end

  def destroy
    cookies.delete :user_id
  end
end 

class ApplicationController < ActionController::Base
  ...
  def current_user
    User.find(cookies.signed[:user_id])
  end     
end
3 голосов
/ 05 октября 2011

Railscasts имеет эпизод по достижению этого, а также отличный HOWTO по реализации этих функций через BDD с RSpec и Capybara .

Я сохраняю информацию о сеансе (идентификатор сеанса + идентификатор пользователя) в базе данных, когда пользователь входит в систему

Я полагаю, что это один из подходов, и приведенное выше приведение делает то же самое с файлами cookie, выпуская каждыйUser учетная запись уникального токена аутентификации.

2 голосов
/ 05 октября 2011

Читал учебник по Rails, и в нем есть реализация "Помни меня"

Вы можете проверить некоторые подсказки (реализация может отличаться от вашей)

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

1 голос
/ 01 декабря 2011

Вот как я реализовал 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
0 голосов
/ 05 октября 2011

Просто пример без соли:

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
...