出于某些令人难以置信的原因,只有一名特定学生不断登出我为教室创建的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
答案 0 :(得分:0)
我认为没有足够的代码来真正调试问题。如果您在编写自己的身份验证代码时没有做出任何决定,我建议您选择类似于设计和节省自己头痛的事情。