2010-12-17 5 views
3

매우 기본적인 것이어야합니다. 필자는 Rails 3와 Authlogic을 함께 사용하기위한 훌륭한 자습서를 따랐습니다. 여러 곳에서 참조되는 것과 동일한 매우 기본적인 인증 셸입니다. 하지만 로그 아웃 기능을 작동시키지 않습니다. 나는 모든 종류의 일을 시도하는 데 시간을 보냈습니다. 그래서 도움이 필요해. 어쩌면 그저 내가 올바르게 이해하지 못하고 있지만 여기에 문제가 있습니다 :Rails/Authlogic - UserSession.destroy가 세션을 종료하지 않습니다.

결론 : @ user_session.destroy는 세션을 종료하지 않습니다.

Details : .xml 형식 요청과 만 상호 작용할 수 있도록 웹 서비스 작업 중입니다 ... 그리고 cURL을 사용하여 테스트하고 있습니다.

내 모든 주요한 문제를 제외하고 모든 것이 잘 작동합니다. 필자는 Users를 사용하여 데이터베이스를 시드합니다.

내가 먼저 로그인하지 않고 다음을 수행하고를 Cookies.txt는 (다른 사용자의 쿠키 또는 인) 빈 때 - 내 요청은 예상대로 (더 세션을) 거부하지

curl -v -H "Accept: text/xml" -X GET --cookie cookies.txt http://localhost:3000/user.xml 

>

내가 이것을 사용하여 로그인 할 때 ->

curl -v -H "Accept: text/xml" -X POST -d 'user_session[email][email protected]&user_session[password]=secret' --cookie-jar cookies.txt http://localhost:3000/user_session.xml 

새로운 세션이 만들어지고 이전에 내 마음 속의 콘텐츠에 GET 할 수 있습니다. >

curl -v -H "Accept: text/xml" -X DELETE --cookie cookies.txt http://localhost:3000/user_session.xml 

UserSessionsController 번호 - 모든 것을 다른 사용자가 쿠키를 사용하여이 일을 ... 내가 로그 아웃 할 때 ... 등

하지만 작동하지 않습니다 어떤 쿠키를 사용하지 않고, 작동하지 않습니다에서 올바르게 작동 파괴 조치

def destroy 
    @user_session = UserSession.find 
    @user_session.destroy 

respond_to do |format| 
    format.html { redirect_to(:users, :notice => 'Goodbye!') } 
    format.xml { head :ok } 
end 
end 

라고하며 작업 내의 라인 - user_session.destroy @ @user_session = UserSession.find 및 이 실행됩니다. 오류 없음 및 테스트 없음 @user_session = 파괴 후 즉시 UserSession.find가 예상대로 생성됩니다.

HOWEVER ... 다음 GET 요청에서 만료되어야하는 동일한 쿠키가 요청에 전달되면 동일한 데이터베이스 조회 그 특정 사용자의 ID가 발생하고 정보가 전달됩니다 - 마치 세션이 계속 존재하는 것처럼 !!

나는 이것이 기본적인 것들이지만 완성도 여기 내와 ApplicationController 알고 :

class ApplicationController < ActionController::Base 
#protect_from_forgery 
helper_method :current_user_session, :current_user 

private 

def current_user_session 
    return @current_user_session if defined?(@current_user_session) 
    @current_user_session = UserSession.find 
end 

def current_user 
return @current_user if defined?(@current_user) 
@current_user = current_user_session && current_user_session.record 
end 

def require_user 
unless current_user 
    respond_to do |format| 
    format.xml { head :unauthorized } 
    end 
    return false 
end 
end 

def require_no_user 
if current_user 
    respond_to do |format| 
    format.xml { head :bad_request } 
    end 
return false 
end 
end 

@user_session = UserSession.find current_user_session에서 - 아웃 로그인 한 사용자를 생산하고 영원히 경우 ... 계속 그렇게 할 것 로그인시 생성 된 원래 쿠키가 제공됩니다.

내가 시도하는대로 세션을 종료 할 수 없습니다. 캐시 히트가 발생하는 것을 보면서 ActiveRecord 캐싱을 끄는 것에 대해서도 집중했습니다. 캐싱이 해제되고 아무 것도 변경되지 않았습니다. 나는 이것이 내가 이해하지 못하거나 작동하지 않는 Authlogic으로 내 부분에 대한 이해의 중대한 오류라고 생각한다.

의견이 있으십니까 ??

답변

1

이 문제를 해결할 방법을 찾지 못했을 경우 세션 기록이 실제로 정리되지 않습니다.이것에 의해 얻을 수있는 한 가지 방법은 cron 작업을 사용하여 주기적으로 세션을 정리하는 것입니다.

여기 내가 찾은 자원입니다 도움 : Sessions and cookies in Ruby on Rails

당신이 (자동 정리 기능 포함) 사용자 세션의보다 지능적인 관리를 위해 설치할 수있는 플러그인도있다 : Limited Sessions

+0

감사합니다. 아니요. 좋은 설명이나 해결책을 찾지 못했습니다. 도움에 정말 감사드립니다. 응답 지연에 대한 미안하지만 나는 휴일을 위해 아주 멀리있었습니다. 내가 검색 할 때 Rails의이 '기능'을 사용하지 않았다는 사실에 놀랐습니다. –

3

Zabba의 우수한을 바탕으로이 답변 로그 아웃 할 때 세션 기록을 정리하는 솔루션을 만들었고, 생성 후 미리 정해진 시간이 지나면 (별도로 - 둘 다 원했습니다). Zabba의 대답은 괜찮 았습니다. Authlogic 내에서 답을 통합하고 싶었습니다.

솔루션은 매우 간단하고 쉽습니다. 다음 두 가지 리소스를 찾을 때까지 어떻게해야하는지 명확하지 않았습니다. 내가 내가 뭘 찾고 있는지 몰랐기 때문에 나는 이것들을 더 일찍 발견하지 못했다고 생각한다.

로그 아웃시 세션 지우기 -이 대답을 사용하면 잘 작동합니다.

Ruby on rails - Authlogic : periodically check if user session is valid

을 그리고 모든 것이 잘 작동하는 것 같군 -

Authlogic and multiple sessions for the same user

는 제한 시간 동안 나는 여기에 두 번째 대답을 사용했다.

관련 문제