在我的Rails应用中,我正在尝试分别为无效flash.now[:alert]
和:email
生成单独的:password
。因此,如果用户输入正确的电子邮件但密码错误,:alert
会向用户发出无效密码警告,反之亦然。这是我在SessionsController中的内容:
def create
if user = User.authenticate(params[:email], params[:password])
session[:user_id] = user.id
redirect_to user.profile, :notice => "Logged in successfully"
elsif user.email != params[:email]
session[:email] = @user.email
flash.now[:alert] = "Invalid email. Try again!"
render :action => 'new'
else
session[:password] = @user.password
flash.now[:alert] = "Invalid password. Try again!"
render :action => 'new'
end
end
渲染这个给我一个未定义的电子邮件方法。谁能帮我弄清楚我做错了什么?
答案 0 :(得分:2)
免责声明:显然这是一个非常糟糕的主意,因为攻击者可以继续尝试发送电子邮件,直到找到匹配的电子邮件,然后他就可以开始尝试使用他知道存在于您数据库中的电子邮件的密码了,但你问,所以由你决定是否这样做。
您的身份验证方法显然只会在电子邮件和密码匹配时返回用户,更改您的身份验证方法以返回布尔值和用户(如果有)。看起来有点像这样:
def authenticate(email, password)
u = first(:conditions => {:email => email, :state => 'active'})
u && u.authenticated?(password) ? [true, u] : [false, u]
end
然后,在你的控制器上:
def create
result , user = User.authenticate(params[:email], params[:password])
if result
session[:user_id] = user.id
redirect_to user.profile, :notice => "Logged in successfully"
elsif user
session[:email] = @user.email
flash.now[:alert] = "Invalid email. Try again!"
render :action => 'new'
else
session[:password] = @user.password
flash.now[:alert] = "Invalid password. Try again!"
render :action => 'new'
end
end
这应该有用。