一个特定用户不断登出

时间:2016-12-07 03:21:35

标签: ruby-on-rails authentication model

出于某些令人难以置信的原因,只有一名特定学生不断登出我为教室创建的rails应用程序。她可以成功登录第一页,显示她帐户的正确信息。当她试图点击第二页时,她将返回主页,其中包含"请登录" flash消息。我从几台不同的计算机上复制了这个问题。另外一百名学生在同一天登录;没有其他学生遇到登录问题。

按照flash消息的路径引导我到会话控制器的create方法。我长期以来一直怀疑我没有正确处理我的应用程序通过两种不同模式登录教师和学生的方式。所以我很想听听你对这个模型的见解,即使你不能帮助我解决标题问题。

  def create
    user = User.find_by(email: params[:session][:email].downcase)
    if user == nil
      user = Student.find_by(username: params[:session][:email].downcase)
    end
    if user && user.authenticate(params[:session][:password])
      log_in user
      params[:session][:remember_me] == '1' ? remember(user) : forget(user)
      redirect_back_or user
    else
      flash.now[:danger] = 'Invalid email/username/password combination'
      render 'new'
    end
  end

或者也许来自sessions_helper.rb的current_user方法没有正确写入。

def dryFindUser(user_id)
    if session[:user_type] == "student"
        Student.find_by(id: user_id)
    else
        User.find_by(id: user_id)
    end
end

def current_user
    if (user_id = session[:user_id])
        @current_user ||= dryFindUser(user_id)
    elsif (user_id = cookies.signed[:user_id])
        user = dryFindUser(user_id)
        if user && user.authenticated?(:remember, cookies[:remember_token])
            log_in user
            @current_user = user
        end
    end
end

# Returns true if the user is logged in, false otherwise.
def logged_in?
    !current_user.nil?
end

# Forgets a persistent session.
def forget(user)
    user.forget
    cookies.delete(:user_id)
    cookies.delete(:remember_token)
end

我仍然非常难过为什么这只发生在一个单身的学生身上,当所有其他学生都工作正常时。

编辑。 David提到他并不知道遗忘方法的作用。我把它添加到上面的session_helper。

LuckyRuby提到我没有提供足够的代码。这是我认为可能适用的另一部分:

application_controller.rb

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
  include SessionsHelper

  # Confirms a logged-in user.
  def logged_in_user
    unless logged_in?
      store_location
      flash[:danger] = "Please log in."
      redirect_to login_url
    end
  end
end

1 个答案:

答案 0 :(得分:0)

我认为没有足够的代码来真正调试问题。如果您在编写自己的身份验证代码时没有做出任何决定,我建议您选择类似于设计和节省自己头痛的事情。