레일에서 세션을 제대로 삭제할 수 없습니다.

아키 타입 2142

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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

할 일 목록에서 li을 삭제할 수 없습니다.

분류에서Dev

저장소에서 파일을 삭제할 수 없습니다.

분류에서Dev

OS X에서 파일을 삭제할 수 없습니다.

분류에서Dev

iOS에서 내 파일을 삭제할 수 없습니다

분류에서Dev

휴지통에서 파일을 삭제할 수 없습니다.

분류에서Dev

cifs 공유에서 파일을 삭제할 수 없습니다.

분류에서Dev

HDD에서 파일을 삭제 / 이동할 수 없습니다.

분류에서Dev

C : \에서 파일을 삭제할 수 없습니다.

분류에서Dev

그룹에서 파일을 삭제할 수 없습니다.

분류에서Dev

emu 8086에서 파일을 삭제할 수 없습니다.

분류에서Dev

레일에서 사용자를 삭제할 수 없습니다.

분류에서Dev

'Storage :: delete'로 파일을 삭제할 수 없습니다.

분류에서Dev

File.Delete (path)로 파일을 삭제할 수 없습니다.

분류에서Dev

Filezilla로 파일을 삭제할 수 없습니다.

분류에서Dev

루트로 파일을 삭제할 수 없습니다.

분류에서Dev

루트로도 파일을 삭제할 수 없습니다.

분류에서Dev

다른 프로세스에서 사용 중이므로 파일을 삭제할 수 없습니다-VB.net

분류에서Dev

SD 카드에 파일을 삭제할 수 없습니다

분류에서Dev

DataContext에서 사용할 때 파일을 삭제할 수 없습니다.

분류에서Dev

CosmosDB에서 항목을 삭제할 수 없습니다.

분류에서Dev

React에서 목록 항목을 삭제할 수 없습니다.

분류에서Dev

SwiftUI : 목록에서 행을 삭제할 수 없습니다.

분류에서Dev

React Native FlatList에서 항목을 삭제할 수 없습니다.

분류에서Dev

ul에서 여러 li을 삭제할 수 없습니다.

분류에서Dev

QList <QByteArray *>에서 항목을 삭제할 수 없습니다.

분류에서Dev

SQLiteDatabase에서 행을 삭제할 수 없습니다.

분류에서Dev

테이블 SQL에서 행을 삭제할 수 없습니다.

분류에서Dev

Rails에서 게시물을 삭제할 수 없습니다.

분류에서Dev

DataGrid에서 행을 삭제할 수 없습니다.

Related 관련 기사

  1. 1

    할 일 목록에서 li을 삭제할 수 없습니다.

  2. 2

    저장소에서 파일을 삭제할 수 없습니다.

  3. 3

    OS X에서 파일을 삭제할 수 없습니다.

  4. 4

    iOS에서 내 파일을 삭제할 수 없습니다

  5. 5

    휴지통에서 파일을 삭제할 수 없습니다.

  6. 6

    cifs 공유에서 파일을 삭제할 수 없습니다.

  7. 7

    HDD에서 파일을 삭제 / 이동할 수 없습니다.

  8. 8

    C : \에서 파일을 삭제할 수 없습니다.

  9. 9

    그룹에서 파일을 삭제할 수 없습니다.

  10. 10

    emu 8086에서 파일을 삭제할 수 없습니다.

  11. 11

    레일에서 사용자를 삭제할 수 없습니다.

  12. 12

    'Storage :: delete'로 파일을 삭제할 수 없습니다.

  13. 13

    File.Delete (path)로 파일을 삭제할 수 없습니다.

  14. 14

    Filezilla로 파일을 삭제할 수 없습니다.

  15. 15

    루트로 파일을 삭제할 수 없습니다.

  16. 16

    루트로도 파일을 삭제할 수 없습니다.

  17. 17

    다른 프로세스에서 사용 중이므로 파일을 삭제할 수 없습니다-VB.net

  18. 18

    SD 카드에 파일을 삭제할 수 없습니다

  19. 19

    DataContext에서 사용할 때 파일을 삭제할 수 없습니다.

  20. 20

    CosmosDB에서 항목을 삭제할 수 없습니다.

  21. 21

    React에서 목록 항목을 삭제할 수 없습니다.

  22. 22

    SwiftUI : 목록에서 행을 삭제할 수 없습니다.

  23. 23

    React Native FlatList에서 항목을 삭제할 수 없습니다.

  24. 24

    ul에서 여러 li을 삭제할 수 없습니다.

  25. 25

    QList <QByteArray *>에서 항목을 삭제할 수 없습니다.

  26. 26

    SQLiteDatabase에서 행을 삭제할 수 없습니다.

  27. 27

    테이블 SQL에서 행을 삭제할 수 없습니다.

  28. 28

    Rails에서 게시물을 삭제할 수 없습니다.

  29. 29

    DataGrid에서 행을 삭제할 수 없습니다.

뜨겁다태그

보관