Сессия [:user_id] изменяется от нуля до предыдущего значения в браузере кнопка возврата

В моем приложении rails, когда я выхожу из системы, в destroy метод я устанавливаю session[:user_id]=nil, Но когда я нажимаю кнопку "Назад" в браузере, session[:user_id] возвращает предыдущее значение и автоматически отображает страницу входа. Почему это происходит? Как мне сделать session[:user_id]=nil настойчив, пока я не изменю это?

session_controller.rb

class SessionsController < ApplicationController

  def index
  end

  def show
  end

  def new
  end

  def create
    @user = User.find_by_email(params[:email])
    if @user && @user.authenticate(params[:password])
      session[:user_id] = @user.id
      redirect_to user_posts_path
    else 
      render 'new'
    end
  end

  def destroy
   session[:user_id] = nil
  end

end

application.html.erb

<% if !(session[:user_id].nil?)%>
    Logged in as <%= current_user.email %>
    <%= link_to 'Log Out', session_path(current_user), :method => :delete %>
<% else %>
    <% if current_page?(new_user_path) %>
        <%= link_to "Log in", login_path %>
    <% elsif current_page?(login_path)  %>
        <%= link_to "sign up",new_user_path%>
    <% else %>
        <%= link_to "Log in", login_path %>
        <%= link_to "sign up",new_user_path%>
    <% end %>
<% end %>

<%= yield %>

нет ошибки в rails s приставка.

последнее сообщение на консоли.

Started DELETE "/sessions/2" for 127.0.0.1 at 2015-10-08 00:23:11 +0530
Processing by SessionsController#destroy as HTML
  Parameters: {"authenticity_token"=>"B0QLdVrsV9ZgwjS/Y8qVb3ID0q9gsC2peFQAZ/0J638kUTpXcAYcg1I+ulX1UaLujr4C7NPgIann74UETMOz6w==", "id"=>"2"}
  Rendered sessions/destroy.html.erb within layouts/application (0.1ms)
Completed 200 OK in 144ms (Views: 143.4ms | ActiveRecord: 0.0ms)

1 ответ

Решение

Использование reset_session вместо этого в вашем выходе из системы. Это выдаст новый идентификатор сеанса и объявит старый недействительным и предотвратит другие атаки, основанные на фиксации сеанса.

http://guides.rubyonrails.org/security.html

Это краткий обзор того, как правильно настроить SessionsController:

Сеансы на самом деле не похожи на стандартный ресурс crud, где у вас есть полный набор глаголов CRUD и выборка записей из базы данных.

С точки зрения пользователя есть только три действия:

new - displays the login form
create - verifies the credentials and signs the user in.
destroy - logs user out by resetting the session.

Измените определение маршрутов, чтобы рассматривать сеансы как единый ресурс:

resource :sessions, only: [:new, :create, :destroy]

Тогда мы собираемся создать помощника:

module SessionsHelper
  def current_user
    @user ||= User.find!(session[:user_id]) if session[:user_id]
  end

  def user_signed_in?
    !current_user.nil?
  end

  def can_sign_in?
    user_signed_in? || current_page?(new_user_path) || current_page?(new_session_path)
  end 
end

Таким образом, фактическая реализация того, как пользователь хранится в сеансе, находится только в одном месте в вашем приложении и не распространяется на все ваши контроллеры и представления.

Давайте удостоверимся, что мы можем вызвать его с наших контроллеров:

class ApplicationController < ActionController::Base
  include SessionsHelper
end

Затем давайте исправим контроллер:

class SessionsController < ApplicationController

  # GET /session
  def new
  end

  # POST /session
  def create
    reset_session # prevents sessions fixation!
    @user = User.find_by(email: params[:email])
    if @user && @user.authenticate(params[:password])
      session[:user_id] = @user.id
      redirect_to user_posts_path 
    else 
      render 'new', flash: "Invalid username or password."
    end
  end

  # DELETE /session
  def destroy
   reset_session 
   if user_signed_in?
     flash[:notice] = 'You have been signed out successfully.'
   else 
     flash[:error] = 'You are not signed in!'
   end
   redirect_to root_path
  end
end

application.html.erb

<%= render partial: 'sessions/actions' %>
<%= yield %>

Мы используем частичное, поскольку макет приложения имеет тенденцию превращаться в монстра.sessions/_actions.html.erb,

<% if user_signed_in? %>
  Logged in as <%= current_user.email %>
  <%= link_to 'Log Out', session_path, method: :delete %>
<% else %>
  <%= link_to 'Log in', new_session_path if can_sign_in? %>
<% end %>
Другие вопросы по тегам