2

我是 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?我的应用程序没有非常高的安全问题或敏感数据。

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

4

1 回答 1

1

如果您希望添加持久登录,则需要通过 cookie 进行。您可以为用户生成会话密钥并将会话数据存储在数据库中。您将此会话密钥写入他们的 cookie,这样您就可以知道当用户返回时要从数据库中提取哪个会话。如果您在此密钥中包含任何用户数据,强烈建议您通过密钥对其进行散列,以防止人们只是“制作”他们自己的会话密钥并访问您的站点。

还要注意,像这样的持久会话会使您的用户群面临会话劫持问题,并引入一些额外的安全问题。在这种情况下,我做的一件常见的事情是要求用户密码来对用户的偏好进行任何更改,并且只依赖于会话密钥进行访问控制。

例子


拥有一个包含您认为需要的任何会话数据的会话模型,该会话应该属于用户。创建一个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模型只会稍微修改它。

于 2013-04-24T16:16:51.507 回答