使用和学习authenticate插件-场景login

authenticate是一个非常有用,也使用非常普遍的插件,在制作memU的时候舍弃了自己造轮子的想法,转而使用这个插件,插件代码不难,但是通过阅读,仍然有很大的收获,下面简单分析一下authentic的源码
从Login说起
首先从登录场景开始分析
ruby 代码
 
  1. def login  
  2.   return unless request.post?  
  3.   self.current_user = User.authenticate(params[:login], params[:password])  
  4.   if logged_in?  
  5.     if params[:remember_me] == "1"  
  6.       self.current_user.remember_me  
  7.       cookies[:auth_token] = { :value => self.current_user.remember_token , :expires => self.current_user.remember_token_expires_at }  
  8.     end  
  9.     redirect_back_or_default(:controller => '/account', :action => 'index')  
  10.     flash[:notice] = "Logged in successfully"  
  11.   end  
  12. end  
从代码来看,使用get方式调用此action会直接渲染login.rhtml,此rhtml中form仍然提交给login,此时form中的用户名和email字段被包装成params[:login],params[:password],此时,首先调用User对象模型的authenticate方法,此方法实际上调用了User.find_by_login方法,假如用户不存在或者密码不匹配,会返回nil。self.current_user实际上调用了authenticated_system.rb中的current_user=()方法,让我们看看相关两个方法的源代码:
ruby 代码
 
  1. def current_user  
  2.   @current_user ||= (session[:user] && User.find_by_id(session[:user])) || :false  
  3. end  
  4.   
  5. # Store the given user in the session.  
  6. def current_user=(new_user)  
  7.   session[:user] = (new_user.nil? || new_user.is_a?(Symbol)) ? nil : new_user.id  
  8.   @current_user = new_user  
  9. end  
如果new_user为nil的话,session[:user]会被设置为:false,否则会保存用户的id,同时,把实例变量@current_user设置为new_user的值。接下来的logged_in?判断session[:user]是否不为:false,是则登录成功,否则重新render当前视图模板。在logged_in?为true之后,会判断用户是否选择了remember_me,如果选择了,则调用current_user方法得到模型对象@current,再调用实例方法remember_me,可以看到,插件没有提供选择cookie保存时间的选项,我们需要自己加上,而插件本身默认的保存时间是两个星期:
ruby 代码
 
  1. def remember_me  
  2.   self.remember_token_expires_at = 2.weeks.from_now.utc  
  3.   self.remember_token            = encrypt("#{email}--#{remember_token_expires_at}")  
  4.   save(false)  
  5. end  
之后,跳转,我们这里需要改变下面一个方法的参数,这个参数同redirect_to方法的参数格式一致(实际上它内部调用了redirect_to方法)
ruby 代码
 
  1. redirect_back_or_default(:controller => '/account', :action => 'index')  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值