문제

나는 Rails의 Restful-Authentication 플러그인으로 간단한 인증 시스템을 얻으려고 노력하고 있으며, 그것이 어떻게 작동하는지 궁금해합니다. b/c 쿠키의 요구 사항이 무엇인지, 어떻게 그렇게 만드는 방법을 알아낼 수없는 것 같습니다. 브라우저는 항상 당신을 기억합니다 (6 개월 이상).

몇 가지 질문 :

1) Ruby 's Restful_authentication에 대해 어떻게 기억하십니까? 이 문제를 해결하기에 좋은 원 라이너를 찾을 수없는 것 같습니다 ...

사용자가 가입하고 "기억"을 확인하면 Rails 응용 프로그램은 사용자가 아무것도하지 않고 다음에 페이지로 이동할 때 3 개월 후에 페이지로 이동하지 않고 어떻게 세션/쿠키를 얻습니까?

2) IP 주소 등과 같은 일종의 정보를 서버에 보내야합니까? 무엇인가요 cookies[:auth_token], 그것은 어디에 정의되어 있습니까?

목표는 다음과 같습니다. 나는 그들이 stackoverflow가 작동하는 방식과 같이 이메일/암호를 다시 입력하기를 원하지 않습니다 :)

도움이 되었습니까?

해결책

다음은 우리가 수행하는 일입니다 (주로 인증 시스템에서 가져온) ... 이것은 우리가 실행중인 로그인을 처리하는 컨트롤러 방법입니다 ...

def login
  if logged_in?
    flash[:notice] = "You are already logged in."
    redirect_to "/" and return
  end
  unless request.post?
    render :layout => 'task' and return
  end
  self.current_user = User.authenticate(params[:login], params[:password])
  if logged_in?
    if params[:remember_me].to_i == 1
      self.current_user.remember_me
      cookies[:auth_token] = {:domain => "#{DOMAIN}", :value => self.current_user.remember_token , :expires => self.current_user.remember_token_expires_at }
    else
      self.current_user.forget_me
      cookies.delete(:auth_token, :domain => "#{DOMAIN}")
      cookies[:auth_token] = nil
    end
    current_user.last_seen_at = Time.now 
    current_user.save
    session[:notice] = "You logged in successfully"
    flash[:notice] = "You logged in successfully"
    redirect_back_or_default(:controller => 'dashboard') and return
    #redirect_back_or_default(:controller => 'index', :action => 'index') and return
  else
    if $failed_login_counter.add_attempt(params[:login]) > MAXIMUM_LOGIN_ATTEMPTS
      logger.info("login rate limiter kicking in, #{MAXIMUM_LOGIN_ATTEMPTS} login attempts failed")
      redirect_to "/denied.html" and return
    end
    flash[:error] = "Unable to authenticate username and password"
    render(:layout => 'task') and return
  end
end

로그 아웃에 이것을 사용하십시오

def logout
  current_user.last_seen_at = Time.now 
  current_user.save
  self.current_user.forget_me if logged_in?
  cookies.delete(:auth_token, :domain => "#{DOMAIN}")
  reset_session
  flash[:notice] = "You have been logged out."
  #redirect_to :back
  redirect_back_or_default(:controller => 'index', :action => 'index') and return
end

그런 다음 - application.rb에서는 다음과 같은 것이 필요합니다.

before_filter :login_from_cookie

def login_from_cookie
  return unless cookies[:auth_token] && !logged_in?
  user = User.find_by_remember_token(cookies[:auth_token])
  if user && user.remember_token?
    user.remember_me
    self.current_user = user
    cookies[:auth_token] = { :domain => "#{DOMAIN}", :value => self.current_user.remember_token , :expires => self.current_user.remember_token_expires_at }
    flash[:notice] = "#{self.current_user.login}, you have logged in successfully"
  end
end

그리고 - 사용자 모델에는 다음과 같은 몇 가지 방법이 있습니다.

# Encrypts some data with the salt.
def self.encrypt(password, salt)
  Digest::SHA1.hexdigest("--#{salt}--#{password}--")
end

# Encrypts the password with the user salt
def encrypt(password)
  self.class.encrypt(password, salt)
end

def remember_token?
  remember_token_expires_at && Time.now.utc < remember_token_expires_at 
end

# These create and unset the fields required for remembering users between browser closes
def remember_me
  self.remember_token_expires_at = 2.weeks.from_now.utc
  self.remember_token            = encrypt("#{email}--#{remember_token_expires_at}")
  save(false)
end

def forget_me
  self.remember_token_expires_at = nil
  self.remember_token            = nil
  save(false)
end

다른 팁

솔직히 그 특정 구현을 확신하지 못합니다. 그러나 일반적인 편안한 인증 방법은 각 요청과 함께 해시 버전의 사용자/비밀번호를 헤더로 전달하는 것입니다. 또는 해시 쿠키 값을 헤더로 사용할 수 있습니다.

나는 또한 두 가지를 포함하는 하이브리드 시스템을 보았습니다. 사용자/패스 외에도 알고 있다면 세션을 통과합니다. 서버 측면 세션이 유효한 경우이를 사용하고 성능을 위해 세션 -> 사용자 관계를 캐시 할 수 있습니다. 세션이 유효하지 않으면 사용자/패스를 사용하여 인증을 시도합니다.

이 유형의 시스템에서는 응답으로 헤더로 세션을 다시 전달합니다.

물론 그것은 루비의 도서관이하는 방식이 아니라 시스템의 작동 방식에 대한 간단한 요약 일뿐입니다.

여기에서 편안한 인증에 대한 전체 자습서를 찾을 수 있습니다.http://railsforum.com/viewtopic.php?id=14216&p=13

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top