2012-02-09 3 views
2

Devise gem이 인증에 사용됩니다.DB 세션 저장소를 사용하여 다른 응용 프로그램과 레일 세션 공유

레일 세션은 데이터베이스에 으로 저장됩니다.

레일스 3 이외의 세션을 사용하기 위해 Session이라는 모델을 만들었습니다. sessions 테이블에 user_id 열을 추가했습니다.

사용자가 로그인하면 세션 테이블에서 user_id 열을 업데이트해야합니다.

protected 
    def after_sign_in_path_for(resource) 
    @session = Session.find_by_session_id(request.session_options[:id]) 
    @session.update_attribute(:user_id, current_user.id) 
    stored_location_for(resource) || root_path if @session.save 
    end 

그러나 직후 최근 session 파괴하고 내가 빈 user_id와 DB에 다른 세션으로 끝낼 도착, 리디렉션 : 그래서 ApplicationController에서 나는 방법을 추가했다.

성공적으로 로그인하면 user_id을 쓰는 가장 좋은 방법은 무엇입니까? (고안의)

답변

1

호세 Valim 대답 :

레일 3.1 있기 때문에, 소장이 설정 : 이전 세션을 강제의 사용자가 로그인이 파괴 될 때 옵션을 갱신하고 새로 만들기.

그럼 제가 한 일은 ApplicationControllerupdate_session 필터를 만드는 것입니다. 레일 이후

before_filter :update_session 

    protected 
    def update_session 
    if user_signed_in? 
     @session = Session.find_by_session_id(request.session_options[:id]) 
     @session.update_attribute(:user_id, current_user.id) 
    end 
    end 

는 DB가 sessions 테이블에서 세션을 얻을 수있는 실제 SQL 호출이 없을 것 쿼리 캐시합니다. 이미 기억에 남습니다. 업데이트에 대해서도 마찬가지입니다. Rails는 처음으로 user_id 만 업데이트합니다. 다른 모든 시간 UPDATE 쿼리는 DBMS로 이동하지 않습니다.

+0

btw,'@ session'에 인스턴스 변수를 사용할 필요가 없습니다. –

관련 문제