Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 使用Rails自动登录?_Ruby On Rails_Authentication_Cookies_Remember Me - Fatal编程技术网

Ruby on rails 使用Rails自动登录?

Ruby on rails 使用Rails自动登录?,ruby-on-rails,authentication,cookies,remember-me,Ruby On Rails,Authentication,Cookies,Remember Me,我正试图用Rails的Restful身份验证插件建立一个简单的身份验证系统,我只是想知道它是如何工作的,b/c我似乎不知道Cookie的要求是什么,以及如何使它让浏览器永远记住你(6个多月) 几个问题: 1) 你怎么记得ruby的restful身份验证?我似乎找不到解决这个问题的好办法 如果用户注册并选中“记住我”,那么rails应用程序如何获得会话/cookie,而不让用户在下一次访问页面(比如3个月后)时做任何事情,只转到页面 2) 我需要向服务器发送一些信息吗,比如他们的IP地址之类的?什

我正试图用Rails的Restful身份验证插件建立一个简单的身份验证系统,我只是想知道它是如何工作的,b/c我似乎不知道Cookie的要求是什么,以及如何使它让浏览器永远记住你(6个多月)

几个问题:

1) 你怎么记得ruby的restful身份验证?我似乎找不到解决这个问题的好办法

如果用户注册并选中“记住我”,那么rails应用程序如何获得会话/cookie,而不让用户在下一次访问页面(比如3个月后)时做任何事情,只转到页面

2) 我需要向服务器发送一些信息吗,比如他们的IP地址之类的?什么是
cookies[:auth\u token]
,在哪里定义


目标是:我不想让他们再次输入电子邮件/密码,就像StackOverflow的工作原理一样:)

老实说,我不确定这个特定的实现是否成功。但是一种常见的RESTful身份验证方法是将用户/密码的散列版本与每个请求一起作为头传递。或者,您可以使用哈希cookie值作为标头

我也见过混合系统,两者都有。除了用户/通行证之外,如果您知道,您还可以通过会话。然后服务器端如果会话有效,它将使用该会话,并可以缓存会话->用户关系以提高性能。如果会话无效,它将尝试使用user/pass进行身份验证

在这种类型的系统中,您需要将会话作为头传递回响应

当然,这只是一个系统如何工作的简要说明,而不是ruby的库是如何工作的。

下面是我们正在做的事情(主要来自经过身份验证的系统)。。。这是处理我们正在运行的登录的控制器方法

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
#用salt加密一些数据。
def自我加密(密码、salt)
摘要::SHA1.hexdigest(“--{salt}--{password}--”)
结束
#使用用户salt加密密码
def加密(密码)
self.class.encrypt(密码,salt)
结束
还记得你的代币吗?
记住\u token\u expires\u在&&Time.now.utc<记住\u token\u expires\u在
结束
#这些选项创建并取消设置在浏览器关闭之间记住用户所需的字段
还记得我吗
self.memory_token_expires_在=2.weeks.from_now.utc时到期
self.memored_token=encrypt(“#{email}--#{memored_token_expires_at}”)
保存(错误)
结束
忘记我吧
self.memory\u token\u expires\u at=nil
self.memory_token=nil
保存(错误)
结束

您可以在这里找到有关restful身份验证的完整教程。

此处隐藏的gem是
$failed\u login\u counter
。你能分享它的代码吗?+很抱歉调用了一个古老的线程。