首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Rails自动登录?

使用Rails自动登录?
EN

Stack Overflow用户
提问于 2009-11-17 10:02:45
回答 3查看 7.4K关注 0票数 4

我正在尝试用Rails的Restful-Authentication插件建立一个简单的身份验证系统,我只是想知道它是如何工作的,b/c我似乎不知道cookies的要求是什么,以及如何让它让浏览器始终记住你( 6+几个月)。

几个问题:

1)你怎么记得ruby的restful_authentication的me?我似乎找不到一个好的一行来解决这个问题……

如果用户注册并选中“记住我”,rails应用程序如何获得会话/cookie,而用户在下一次访问页面时(比如3个月后)除了转到页面之外什么都不做?

2)我是否需要向服务器发送某种信息,比如他们的IP地址或其他信息?什么是cookies[:auth_token],它是在哪里定义的?

我们的目标是:我不希望他们不得不再次输入他们的电子邮件/密码,就像StackOverflow的工作方式一样:)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-11-24 08:25:13

下面是我们正在做的事情(主要取自认证系统)……这是控制器方法,它处理我们正在运行的登录...

代码语言:javascript
复制
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

并使用此命令注销

代码语言:javascript
复制
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中,你需要类似这样的东西:

代码语言:javascript
复制
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

在你的用户模型中有一些这样的方法:

代码语言:javascript
复制
# 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
票数 7
EN

Stack Overflow用户

发布于 2009-11-17 10:20:54

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

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

在这种类型的系统中,您可以将会话作为头部传递回响应。

当然,这只是一个系统如何工作的快速概述,而不是ruby的库如何工作。

票数 0
EN

Stack Overflow用户

发布于 2009-12-18 21:19:04

你可以在这里找到关于restful认证的完整教程。http://railsforum.com/viewtopic.php?id=14216&p=13

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1746155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档