2011-03-09 2 views
3

내 앱에서 30 분 후에 세션을 종료하도록 Devise를 설정합니다. 잘 작동하는 ... 사용자가 그 시간 이후에 다시 로그인해야합니다. 내 유일한 문제는 세션이 시간 초과 된 후 세션 컨트롤러에서 destroy 작업을 사용하지 않는 것입니다. 따라서 사용자의 signed_in 속성은 'false'로 설정되지 않습니다. 따라서 세션이 시간 초과 된 후에도이 사용자는 온라인 상태로 표시됩니다. 시간 초과 후 세션을 삭제하거나 브라우저가 닫힌 후 특정 시간 후에 signed_in 속성을 false로 설정할 수 있습니까?Rails 3 + Devise : 시간 초과 후 사용자 로그 아웃

def destroy 
    current_user.try("signed_in=", false); current_user.save 
    signed_in = signed_in?(resource_name) 
    sign_out_and_redirect(resource_name) 
    set_flash_message :notice, :signed_out if signed_in 
end 

답변

1

: 마지막 요청이 있다면 모든 행동으로

before_filter :last_request 

def last_request 
if user_signed_in? 
    if current_user.last_request_at < 1.minutes.ago 
    current_user.update_attribute(:last_request_at, Time.now) 
    end 
    if current_user.currently_signed_in = false 
     current_user.update_attribute(:currently_signed_in, true) 
    end 
end 
end 

응용 프로그램 검사 :

은 application_controller에 넣고 1 분 전, 예인 경우 사용자 속성을 업데이트합니다. user.rb에서

넣어이 :

before_save :set_last_request 

Warden::Manager.after_authentication do |user,auth,opts| 
    user.update_attribute(:currently_signed_in, true) 
end 

Warden::Manager.before_logout do |user,auth,opts| 
    user.update_attribute(:currently_signed_in, false) 
end 

def set_last_request 
    self.last_request_at = Time.now 
end 

def signed_in? 
if self.currently_signed_in 

    if self.timedout?(self.last_request_at.localtime) 
    return false 
    else 
    return true 
    end 

else 
    false 
end 
end 

그런 다음 signed_in을 사용할 수 있습니까? 메서드를 사용하여 사용자의 온라인 상태를 확인합니다.

4

내가 정확히 고안에 대한 전문가가 아니에요하지만이 때문에 HTTP의 비 저장 특성 의심 :

세션 컨트롤러에 조치를 파괴하는 내. Devise는 사용자가 제한 시간이 지난 후 페이지에 다시 액세스하려고 시도 할 때 세션이 시간 초과되었다는 것을 알고 있으며 사용자가 실제로 로그 아웃하고 destroy 메소드가 세션 컨트롤러에서 호출 될 때만 destroy 메소드를 호출합니다.

원하는 것을 얻기 위해서는 이전 세션을 스윕하고 수동으로 destroy 메소드를 호출해야합니다 (또는 유사한 작업을 수행해야합니다). 정확한 온라인/오프라인 상태가 다음과 같이 작동 새로운 고안 버전으로

관련 문제