Ruby on rails 带有Authlogic和调用reset_会话的Rails 3

Ruby on rails 带有Authlogic和调用reset_会话的Rails 3,ruby-on-rails,ruby-on-rails-3,session,authlogic,session-fixation,Ruby On Rails,Ruby On Rails 3,Session,Authlogic,Session Fixation,声明您应该“在成功登录后发出新的会话标识符并声明旧的无效”,使用reset_session方法来对抗会话固定 在使用Authlogic时,我找不到有关调用reset_会话的任何指导。这是否只是将该方法包含在控制器方法中的一种情况(如下所示) 我只是担心会给Authlogic带来问题,因为在调用reset_会话之前,我可以在会话散列中看到user_凭据和user_凭据的id键和值 class UserSessionsController < ApplicationController

声明您应该“在成功登录后发出新的会话标识符并声明旧的无效”,使用reset_session方法来对抗会话固定

在使用Authlogic时,我找不到有关调用reset_会话的任何指导。这是否只是将该方法包含在控制器方法中的一种情况(如下所示)

我只是担心会给Authlogic带来问题,因为在调用reset_会话之前,我可以在会话散列中看到user_凭据和user_凭据的id键和值

class UserSessionsController < ApplicationController

  def create
    @user_session = current_client.user_sessions.new(params[:user_session])
    if @user_session.save
      reset_session
      flash[:success] = I18n.t(:msg_login_success)
      redirect_back_or_default application_root_path
    else
      render :action => :new
    end
  end
class UserSessionController:新建
结束
结束

是的,在用户登录后重置会话(这看起来是怎么回事?)肯定是不对的。您希望在用户登录之前执行此操作

理想情况下,在登录用户之前,您可能希望这样做,但前提是登录确实会成功——但我不确定您是否能够让auth_logic做到这一点,我对auth_logic不是很有经验,尽管这对于auth_logic来说是一个非常好的问题,如果我是您,我会将其作为auth_logic的支持票证归档

但同时,您可能只想尝试将
重置会话
放在操作方法的顶部,在
@user\u session=current\u client.user\u sessions.new(params[:user\u session])
之前。我认为这会起作用,更糟糕的是,在某些情况下,您确实不需要重置会话(如果用户的凭据无效),但我认为这不会导致严重问题。(哦,除非它导致您丢失验证错误?)


但是,这里不是一位权威逻辑专家。我不希望你接受这个答案,因为我没有专业知识来真正回答它,只是分享我的想法,以防它对你有所帮助,并给你一些如何思考的建议

作为参考,这是我目前的方法:

def create
  @user_session = current_client.user_sessions.new(params[:user_session])

  if @user_session.save
    # reset session to counter session fixation
    # whilst retaining values except for those that the application has created specific to the current user
    temp_session = session.merge("current_user" => {}).clone
    reset_session
    session.reverse_merge!(temp_session)
    # set flash msg and redirect
    flash[:success] = I18n.t(:msg_login_success)
    redirect_back_or_default application_root_path
  else
    render :action => :new
  end
end

根据

中的建议,在成功登录后仍然执行重置会话的调用,向临时会话添加“当前用户”=>{}有什么意义?这样做是为了清空会话中“当前用户”键的内容