Сессия [: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 %>