自动登录使用Rails?
-
20-09-2019 - |
题
我试图得到了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