2014-06-24 3 views
3

사용자 인증을 위해 Devise가 있습니다. 특정 ID로 사용자를 로그 아웃하려고합니다. 내 컨트롤러Devits in Rails로 특정 사용자 로그 아웃

def exit 
    @user = User.find(5) 
    sign_out(@user) # this line here signs out the current_user 
    end 

부호 밖으로 유증의 명령

, 나는이 @user을 통과하더라도, 그것은 CURRENT_USER을 서명합니다. 데이터베이스에서 사용자를 선택하고 devise 명령으로 사인 아웃 할 수 있습니까?

+0

테스트 또는 개발/프로덕션 환경에서 사용자를 서명하는 것에 대해 이야기하고 있습니까? –

+1

목적은 무엇입니까? '@ user' 세션이 설정되어 있는지 확인하십시오 – Nithin

+0

['devise rememberable module'] (https://github.com/plataformatec/devise/blob/master/lib/devise/models/rememberable.rb)를보십시오. –

답변

5

특정 사용자를 로그 아웃하려는 일부 관리 모듈의 일부인 것으로 가정합니다.

그러나 이것은 쉽게 해결할 수있는 이 아니며입니다. 사용자가 로그인했는지 여부는 세션에 저장됩니다. 따라서 다른 사용자를 로그 아웃하려면 해당 세션에 대한 액세스 권한이 있어야합니다.

참고 : afaik의 sign_out 메서드는 현재 세션에서만 작동하거나 워든 (관리자 만 잘 모름)이 현재 서버가 만난 모든 세션까지 확장 될 수 있습니다. 그러나 : 승객이나 레일 서버 클러스터 (꽤 일반적입니다)를 사용하는 경우 afaik이 작동하지 않습니다. 나는 약간의 설명과 함께 다르게 듣고 싶을 것이다 :) sign_out은 주어진 매개 변수를 사용하여 현재 세션에서 (afaik)에서 로그 아웃 할 범위를 결정한다.

그래서 우리가 일반적으로 한 것은 모든 사용자를 로그 아웃하기위한 일종의 비상 버튼을 추가하는 것입니다. 모든 세션을 파괴합니다. 이것은 데이터베이스 또는 문서 저장소로 백업 된 세션 저장소를 사용하는 경우에만 가능합니다.

다른 방법으로 모든 세션을 열고 사용자에게 맞는 올바른 세션을 찾은 다음 해당 세션을 삭제할 수 있습니다. 액티브에 저장된의 특정 세션에서 데이터를 읽을 수

는 다음을 작성할 수 있습니다

@session = ActiveRecord::Base.connection.select_all("SELECT * FROM sessions WHERE session_id = '#{sess_id}'") 
Marshal.load(ActiveSupport::Base64.decode64(@session.data)) 

이 대안 적 방법 :

  • 사용 Timeoutable 모듈, 그리고에 대한 시간 제한을 강제로 사용자?
  • Rememberable을 사용하는 경우 @user.forget_me을 할 수는 있지만 실제로 이것이 현재 세션에 영향을 미치는지 확신 할 수 없습니까?
관련 문제