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

几个问题:

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

如果一个用户注册,并检查“记住我”,如何在Rails应用程序获取会话/ cookie的,而无需用户做任何事情,但在下次访问页面时经常去的页面,说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

其他提示

我真的不知道该aboout特定的实现。但认证的公共RESTful方法是通过用户名/密码的哈希版本与每个请求作为报头。或者,也可以使用一个散列cookie值作为报头。

我还可以看出,同时涉及混合系统。您通过在会话中,如果你知道它,除了用户名/密码。然后,服务器端的会话是否有效,它使用的是和可以隐藏会话 - >性能的用户关系。如果会话是无效的,它试图使用用户名/密码验证。

在这种类型的系统的你传递会话背面上的响应作为报头。

当然,这是一个系统是如何发挥作用只是一个快速破败,不Ruby的图书馆怎么做。

您可以在这里找到宁静的身份验证的整个教程。 http://railsforum.com/viewtopic.php?id=14216&p=13

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top