Ruby on Rails 튜토리얼 ( https://www.railstutorial.org/book/log_in_log_out ) 을 따릅니다 . 로그 아웃 기능이 작동하지 않습니다. '세션'컨트롤러를 생성하고 인스턴스 변수 인 'current_user'를 'log_out'으로 파괴하는 메서드를 정의했으며 log_out 메서드가 호출되면 nil로 변경됩니다. sessions_helper.rb의 'log_out'메소드.
module SessionsHelper
def log_in(user)
session[:user_id] = user.id
end
def remember(user)
user.remember
cookies.permanent[:remember_token] = user.remember_token
cookies.permanent.signed[:user_id] = user.id
end
def current_user
if (user_id = session[:user_id])
@current_user ||= User.find_by(id: session[:user_id])
elsif (user_id = cookies.signed[:user_id])
user = User.find_by(id: user_id)
if user && user.authenticated?(cookies:[:remember_token])
log_in user
@current_user = user
end
end
end
def logged_in?
!current_user.nil?
end
def log_out
debugger
session.delete(:user_id)
@current_user = nil
end
end
'/ logout'에 DELETE 요청을 사용합니다.
delete 'logout' => 'sessions#destroy'
보기에서 레이아웃의 관련 부분
<% if logged_in? %>
<ul class="text-center nav navbar-nav navbar-right">
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Account <span class="caret"></span></a>
<ul class="text-center dropdown-menu">
<li class="text-center"><%= link_to "Profile", current_user %></li>
<li class="text-center"><%= link_to "Settings", "#" %></li>
<li role="separator" class="divider"></li>
<li class="text-center"><%= link_to "Log Out", logout_path, :method => :delete %></li>
</ul>
</li>
</ul>
<% else %>
<li><a id="signin" href="/login">Sign In</a></li>
<% end %>
view가 변경되지 않기 때문에 log_out 메서드가 작동하지 않는다고 생각합니다. 줄에 따르면, logs_in 메서드는 <% if logged_in? %>
세션이 삭제 될 때 뷰의 일부가 렌더링되는 것을 방지해야합니다. 어디에 'logged_in?' 메서드는 사용자가 로그인 한 경우 부울 값 true를 반환하는 sessions_helper.rb에 정의되어 있습니다.
전체 route.rb
Rails.application.routes.draw do
root 'static_pages#home'
get 'about' => 'static_pages#about'
get 'help' => 'static_pages#help'
get 'signup' => 'users#new'
get 'login' => 'sessions#new'
post 'login' => 'sessions#create'
delete 'logout' => 'sessions#destroy'
resources :users
end
전체 sessions_controller.rb
class SessionsController < ApplicationController
def new
end
def create
user = User.find_by(email: params[:session][:email].downcase)
if user && user.authenticate(params[:session][:password])
log_in user
remember user
redirect_to user
else
flash.now[:danger] = 'Invalid email/password combination'
render 'new'
end
end
def destroy
log_out
end
end
전체 세션 _helper.rb
module SessionsHelper
def log_in(user)
session[:user_id] = user.id
end
def remember(user)
user.remember
cookies.permanent[:remember_token] = user.remember_token
cookies.permanent.signed[:user_id] = user.id
end
def current_user
if (user_id = session[:user_id])
@current_user ||= User.find_by(id: session[:user_id])
elsif (user_id = cookies.signed[:user_id])
user = User.find_by(id: user_id)
if user && user.authenticated?(cookies:[:remember_token])
log_in user
@current_user = user
end
end
end
def logged_in?
!current_user.nil?
end
def log_out
session.delete(:user_id)
@current_user = nil
end
end
Rails에서 사용자를 로그 아웃하는 적절한 방법 은 세션을 무효화하는 것 입니다.
def log_out
reset_session
@current_user = nil
end
Rails에서 세션은 방문자가 사이트를 처음 방문 할 때 세션 ID (해시)와 함께 쿠키를 발급 받는다는 것입니다. 이것은 저장된 세션 (쿠키라고도 함)에 연결되며 레일은 어떤 세션 ID가 유효한지 추적합니다.
reset_session
세션 고정 및 재생 공격과 같은 것을 피하려는 경우 매우 중요한 서버의 세션 ID를 무효화합니다. 또한 새 세션 ID를 발행합니다.
이렇게 session.delete(:user_id)
클라이언트 만이 보유 세션 저장 쿠키를 조작합니다. 예를 들어 클라이언트가 이전 쿠키를 보내더라도 여전히 로그인 상태입니다!
그렇다면 튜토리얼에없는 이유는 무엇입니까?
M. Hartl의 Rails Tutorial 책은 공식적으로 승인되지 않았으며 주요 개념을 잘 설명하고 있지만 매우 의심스러운 내용이 많이 포함되어 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다