使用额外的详细信息在rails应用中保持用户状态

时间:2013-04-24 16:10:58

标签: ruby-on-rails ruby-on-rails-3 authlogic remember-me

我是rails的新手,之前我曾与Yii(PHP,MVC框架)进行过广泛的合作。 Yii,允许Web用户方法设置状态变量,例如

Yii::app()->user->userid 
Yii::app()->user->name

我的rails应用程序需要存储有关用户的类似数据,可随意访问。用户名,角色和个人资料图片名称等数据。我正在使用authlogic并使用以下函数将用户的状态存储在会话变量中:

 def login

  @user_session = UserSession.new(:email => params['email'] , :password => params['password'],:remember_me => params['remember_me'] )
  @user = User.where(:email => params['email']).first

      if @user_session.save && @user.access_status = 'active'


             session[:user_name] = @user.name
             session[:user_pic]  = @user.profile_pic_file_name
             session[:user_level] = @user.user_level
             redirect_to :action => 'index'
      else
          ...
      end 
 end

这很好用,但我决定添加一个'记住我'功能。关闭浏览器并重新打开后,我的会话变量赋值(名称,角色和图片名称)不再存在,我得到所有的nil值。用户ID仍然存在,用户仍然登录。

实施此操作的最佳方法是什么?我可以在authlogic本身中设置值(因为即使在浏览器关闭后authlogic也会保留用户ID),还是应该使用存储在浏览器中的cookie?我的应用程序没有很高的安全性问题或敏感数据。

我正在寻找一个优雅的解决方案,因为我打算存储的数据经常会在多个地方使用。

1 个答案:

答案 0 :(得分:1)

如果您希望添加持久登录,则需要通过cookie执行此操作。您可以为用户生成会话密钥,并将会话数据存储在数据库中。您将此会话密钥写入其cookie,以便您在用户返回时知道从DB中提取哪个会话。如果您在此密钥中包含任何用户数据,强烈建议您通过密钥对其进行哈希处理,以防止人们“制作”自己的会话密钥并进入您的网站。

另外请注意,像这样的持久会话会打开您的用户群,导致会话隐藏问题,并引入一些额外的安全问题。我在这种情况下做的一件很常见的事情是要求用户密码对用户的首选项进行任何更改,并且只依赖会话密钥进行访问控制。

实施例


拥有一个会话模型,其中包含您认为需要的任何会话数据,此会话应属于用户。使用以下函数创建sessions_helpers文件:

def remember(user)
  # ideally give an expiration
  cookies.permanent[:remember_token] = user.remember_token
end

def sign_out
  cookies.delete :remember_token
end

def current_user
  @current_user ||= User.find_by_remember_token(cookies[:remember_token])
end

然后在ApplicationController include SessionHelper内,您可以在所有控制器/视图中访问这些内容。允许您执行current_user.user_id以在控制器操作中获取登录的用户ID。

从上面的代码中,您还需要在remember_token模型上定义User方法。在此示例中,没有Session模型或数据库表它只使用User(可能适合您的需要或可能不适合),但添加Session模型只会略微修改它。