我将所有会话信息存储在数据库中。用户可以登录系统做某事。用户登录需要一些限制区域。如果用户在登录前尝试访问这些区域,系统会将其重定向到登录页面。
有时用户可以在不注销的情况下关闭浏览器。如果发生这种情况,下次当他尝试登录时,即使用户输入正确的用户名和密码,系统也无法识别新生成的会话。然后系统将强制用户再次登录。
有人知道如何解决这个问题吗?在加载登录页面之前,我尝试使用reset_session
重置会话。问题无法解决。
会话控制器
def new
end
def create
session[:current_account] = Account.authenticate(params[:email], params[:password])
if session[:current_account]
redirect_to :controller => "xxxxx", :action => "index"
else
flash[:notice] = "Please try again."
render :action => 'new'
end
end
帐户模型
def self.authenticate(email, pass)
account = find_by_email(email)
account && account.authenticated?(pass) ? account : nil
end
def authenticated?(pass)
encrypted_password == Account.encrypt(pass,salt)
end
Xxxxx控制器
before_filter :permission_handling
def index
end
应用程序控制器
def permission_handling
unless logged_in?
forced_login
end
end
def logged_in?
session[:current_account].is_a?(Account)
end
def forced_login
flash[:notice] = "You haven't login yet!"
redirect_to ( :controller => "sessions", :action => "new" )
end
谢谢大家。 :)
答案 0 :(得分:2)
看起来您正在会话中存储Account对象。建议不要这样做:您应该只存储简单的值,例如会话中的帐户ID。
更改Model.authenticate
以返回account.id
,并通过从数据库加载帐户而不是将其保留在会话中来检查logged_in
。
我不确定这是否完全解决了这个问题,但它可能很重要。