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