自动登录使用Rails? [英] Automatic Login with Rails?

查看:120
本文介绍了自动登录使用Rails?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想获得与Rails的宁静的验证插件简单的认证系统,和我只是想知道它是如何工作的,B / C我似乎无法找出什么要求是饼干,以及如何使它所以浏览器总是记得你(为6个月以上)。

几个问题:

1)你如何为Ruby的restful_authentication做remember_me的?我似乎无法找到一个很好的单行来解决这个问题...

如果一个用户注册,并检查记住我,如何在Rails应用程序获取会话/饼干无需用户做任何事情,但在下次访问页面时去的页面,说3个月以后<? / p>

2)我是否需要某种信息的发送到服务器,就像他们的IP地址什么的?什么是饼干[:AUTH_TOKEN] ,其中该定义

我们的目标是:我不希望他们再次输入他们的电子邮件/密码,像计算器是如何工作的:)


解决方案

下面就是我们正在做的事情(从身份验证系统主要是采取了)......这是处理我们正在运行login控制器方法...

  DEF登录
  如果LOGGED_IN?
    闪光[:通知] =您已经登录。
    redirect_to的/和返回
  结束
  除非request.post?
    渲染:布局=&GT; 任务和返回
  结束
  self.current_user = User.authenticate(PARAMS [:登录],则params [:密码])
  如果LOGGED_IN?
    如果PARAMS [:remember_me] .to_i == 1
      self.current_user.remember_me
      饼干[:AUTH_TOKEN] = {:域=&GT; #{} DOMAIN:价值=&GT; self.current_user.remember_token,:到期=&GT; self.current_user.remember_token_expires_at}
    其他
      self.current_user.forget_me
      cookies.delete(:AUTH_TOKEN,:域=&gt;中#{DOMAIN})
      饼干[:AUTH_TOKEN] =零
    结束
    current_user.last_seen_at = Time.now
    current_user.save
    会话[:通知] =您登录成功
    闪光[:通知] =您登录成功
    redirect_back_or_default(:控制器=&GT;仪表盘)和返回
    #redirect_back_or_default(:控制器=&GT;'指数',:动作=&GT;'指数')和返回
  其他
    如果failed_login_counter.add_attempt $(PARAMS [:登录])GT; MAXIMUM_LOGIN_ATTEMPTS
      logger.info(登录率限制器踢,#{} MAXIMUM_LOGIN_ATTEMPTS登录尝试失败)
      redirect_to的/denied.html而归
    结束
    闪光[:错误] =无法验证用户名和密码
    渲染(:布局=&GT;'任务')和返回
  结束
结束

,并使用这个注销

 高清注销
  current_user.last_seen_at = Time.now
  current_user.save
  self.current_user.forget_me如果LOGGED_IN?
  cookies.delete(:AUTH_TOKEN,:域=&gt;中#{DOMAIN})
  reset_session
  闪光[:通知] =您已被注销。
  #redirect_to:回
  redirect_back_or_default(:控制器=&GT;'指数',:动作=&GT;'指数')和返回
结束

然后 - 在你的application.rb中你需要这样的:

 的before_filter:login_from_cookie高清login_from_cookie
  返回除非饼干[:AUTH_TOKEN&放大器;&安培; !登录?
  用户= User.find_by_remember_token(饼干[:AUTH_TOKEN])
  如果用户放大器;&安培; user.remember_token?
    user.remember_me
    self.current_user =用户
    饼干[:AUTH_TOKEN] = {:域=&GT; #{} DOMAIN:价值=&GT; self.current_user.remember_token,:到期=&GT; self.current_user.remember_token_expires_at}
    闪光[:通知] =#{} self.current_user.login,您已成功登录
  结束
结束

和 - 在您的用户模型中有这样一些方法:

 #加密与盐的一些数据。
高清self.encrypt(口令,盐)
  消化:: SHA1.hexdigest( - #{盐} - #{密码} - )
结束#加密与用户盐的密码
高清加密(密码)
  self.class.encrypt(口令,盐)
结束高清remember_token?
  remember_token_expires_at&功放;&安培; Time.now.utc&LT; remember_token_expires_at
结束#这些创造和取消的记忆浏览器关闭之间的用户所需的字段
高清remember_me
  self.remember_token_expires_at = 2.weeks.from_now.utc
  self.remember_token =加密(#{EMAIL} - #{remember_token_expires_at})
  保存(假)
结束高清forget_me
  self.remember_token_expires_at =零
  self.remember_token =零
  保存(假)
结束

I am trying to get up a simple authentication system with Rails' Restful-Authentication plugin, and am just wondering how it works, b/c I can't seem to figure out what the requirements are for cookies, and how to make it so the browser always remembers you (for 6+ months).

Few questions:

1) How do you do remember_me's for ruby's restful_authentication? I can't seem to find a good one-liner to solve this problem...

If a user signs up and checks "Remember Me", how does the rails application get the session/cookie without the user doing anything but going to the page the next time they go to the page, say 3 months later?

2) Do I need to send some sort of info to the server, like their IP address or something? What is cookies[:auth_token], where is that defined?

The goal is: I don't want them to have to enter their email/password again, like how StackOverflow works :)

解决方案

Here's what we're doing (largely taken from authenticated system) ... this is the controller method that handles login that we're running...

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

And use this for logout

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

Then - in your application.rb you'll need something like:

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

And - in your User model have some methods like this:

# 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

这篇关于自动登录使用Rails?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆