2014-06-25 1 views
2

나를 기억하는 sign_in 페이지가 있습니다. 기억하십시오 - 로그 아웃 버튼을 클릭하지 않는 한 세션을 영원히 기억하십시오 (만료일 20 년).브라우저가 닫힐 때 세션이 파기 됨 - Ruby on Rails

문제는 내가 기억하고 있는지 확인하지 않으면 로그인 할 수 없다는 것입니다.

SessionController : 사용자가 나를 기억 확인란을 선택하지 않은 경우 로그인으로

def create 
    user = User.find_by(email: params[:email].downcase) 
    if user && user.authenticate(params[:password]) 
     if params[:remember_me] 
     sign_in user 
     redirect_to root_url 
     else 
     User.find_by_id(session[:remember_token]) 
     session[:remember_token] = user.id 
     redirect_to root_url 
     end 
    else 
     flash.now[:danger] = 'Invalid email/password combination' 
     render 'new' 
    end 
    end 

SessionHelper 당신의 create 방법에서

def sign_in(user) 
    remember_token = User.new_remember_token 
    cookies.permanent[:remember_token] = remember_token 
    user.update_attribute(:remember_token, User.encrypt(remember_token)) 
    self.current_user = user 
    end 

    def signed_in? 
    !current_user.nil? 
    end 

    def current_user=(user) 
    @current_user = user 
    end 

    def current_user 
    remember_token = User.encrypt(cookies[:remember_token]) 
    @current_user ||= User.find_by(remember_token: remember_token) 
    end 

    def sign_out 
    self.current_user = nil 
    cookies.delete(:remember_token) 
    end 
+0

브라우저가 닫힐 때 로그 아웃하기 위해 서버로 아약스 전화를 걸 수 있습니다. – emrahbasman

+0

체크 아웃 http://railscasts.com/episodes/274-remember-me-reset-password?view=asciicast – Mandeep

답변

2

, 당신은 실제로 사용자를 표시하지 않았다. session[:remember_token]user.id 만 저장합니다.

if user && user.authenticate(params[:password]) # valid email & password 
    if params[:remember_me]      # remember me 
    sign_in user 
    redirect_to root_url 
    else           # do not remember me 
    #User.find_by_id(session[:remember_token]) # this line did nothing 
    session[:remember_token] = user.id   # store user.id in session 
    redirect_to root_url 
    end 
else 
    ... 
end 

당신의 current_user 세션에서 user.id 확인, 만 쿠키 또는 current_user의 수동 할당을 확인하지 않습니다.

I는 다음과 같이 현재 사용자를 다시 작성합니다 : BTW

def current_user 
    if @current_user 
    @current_user 
    elsif session[:remember_token] 
    @current_user ||= User.find_by_id(session[:remember_token]) 
    elsif cookies[:remember_token] 
    remember_token = User.encrypt(cookies[:remember_token]) 
    @current_user ||= User.find_by(remember_token: remember_token) 
    else 
    nil 
    end 
end 

. 제목은 본문에 정의 된 문제와 관련이 없습니다.