복붙노트

[RUBY-ON-RAILS] 청산 세션에서 정지 고안

RUBY-ON-RAILS

청산 세션에서 정지 고안

사용자가 표준 고안 컨트롤러를 통해 로그 아웃 할 때, 유증 전체 세션 저장소뿐만 아니라 자신의 데이터를 파괴 보인다. 이 문제를 방지 할 수있는 방법이 있습니까? 나는 주위에 보관해야 다른 관련없는 데이터를 가지고있다.

session[:my_var] = "123"

유증을 통해 로그 아웃 ...

puts session[:my_var]
# => nil

해결법

  1. ==============================

    1.SessionsController의 destroy¹ 방법은 다음과 같은 라인을 포함 :

    SessionsController의 destroy¹ 방법은 다음과 같은 라인을 포함 :

    signed_out = Devise.sign_out_all_scopes ? sign_out : sign_out(resource_name)
    

    sign_out_all_scopes² 메소드 호출은 인수없이 warden.logout하고 sign_out³ 메소드 호출은 (범위) warden.logout.

    logout⁴ 방법 상태의 문서 :

    결론 : 특정 범위를 지정한 경우 sign_out 세션을 유지해야한다. 그러나, 나는 그렇게 할 수있는 방법이 표시되지 않습니다. sign_out_all_scopes은 항상 먼저라고하며,이 모든 사용자를 로그온 할 수 없습니다 경우에만 false를 반환합니다.

    나도 그들의 이슈 트래커에 기능 요청을 게시하거나 사용자 인증 솔루션을 개발하는 것이 좋습니다. 지금은 레일 has_secure_password를 제공하고, 요즘 사람들은 이러한 문제에 실행 방지하기 위해 후자가는 것 같다.

    ¹ 고안 :: SessionsController 번호 파괴

    ² 고안 :: 컨트롤러 :: 도우미 # sign_out_all_scopes

    ³ 고안 :: 컨트롤러 :: 도우미 # sign_out

    ⁴ 소장 : 프록시 # 로그 아웃

  2. ==============================

    2.(가) 장치의 버전을 지속에 대신 그냥 사용할 수, 세션 컨트롤러를 오버라이드 (override) 할 필요는 없습니다 :

    (가) 장치의 버전을 지속에 대신 그냥 사용할 수, 세션 컨트롤러를 오버라이드 (override) 할 필요는 없습니다 :

    config.sign_out_all_scopes = false
    

    devise.rb 파일에서 원하는 동작을 얻을 수 있습니다.

  3. ==============================

    3.나는 쇼핑 카트를 보존하기 위해 그랬던 것처럼 당신은 고안의 SessionController을 무시할 수 :

    나는 쇼핑 카트를 보존하기 위해 그랬던 것처럼 당신은 고안의 SessionController을 무시할 수 :

    sessions_controller.rb

    class SessionsController < Devise::SessionsController
    
        def destroy
            order_id = session[:order_id] 
            super  
            session[:order_id] = order_id
        end
    
    end
    

    routes.rb

    devise_for :users, :controllers => { :sessions => "sessions" }
    
  4. ==============================

    4.Mattheus뿐만 아니라. 문

    Mattheus뿐만 아니라. 문

    signed_out = (Devise.sign_out_all_scopes ? sign_out : sign_out(resource_name))
    

    여러 역할에 체결 될 수있는 가능성을 고려 문 밖으로 가장 일반적인 로그, 아마도. , 당신이 경우에, 사용자가 하나 개의 역할로 로그인, 당신은 signout에 세션의 나머지 부분을 보존하려는 경우, 가장 쉬운 방법은 할 수 있습니다 :

    $ git clone git://github.com/plataformatec/devise.git
    $ cd devise
    $ git branch my_devise
    $ git checkout my_devise
    

    편집기에서 열기 애플 리케이션 / 컨트롤러 / 궁리 / sessions_controller.rb. 방법 파괴에 대체

    signed_out = (Devise.sign_out_all_scopes ? sign_out : sign_out(resource_name))
    

    signed_out = sign_out(resource_name)
    

    저장하고 종료 편집기와 할

    $ git commit -am "remove only warden data from session on logout, preserve other data."
    

    프로젝트의 Gemfile에, 같은 고안 종속성을 설명

    gem 'devise', :path => "[YOUR PATH]/devise", :branch => "my_devise"
    
  5. from https://stackoverflow.com/questions/10153040/stop-devise-from-clearing-session by cc-by-sa and MIT license