【发布时间】:2015-08-26 21:29:45
【问题描述】:
我正在尝试验证用户的登录尝试并通知他们
- 他们的用户名错误或
- 他们的密码错误(因为我个人非常讨厌网站没有告诉我密码是什么,但那不是重点)。
我已经阅读了很多关于这个问题的 SO 帖子,但我发现的那些帖子已经有好几年了,我正在与 CodeIgniter 3.0.1 打交道。
这是我已有的代码。我正在使用Eclipse PDT 作为我的 IDE,我非常喜欢它(但这已经偏离了轨道),所以我已经能够逐步执行并观察它完全失败了。
IF (!$this->User->login( //Testing shows this works fine - the SWITCH statement gets executed as it should and the BADUSERNAME case is followed through.
addslashes(strtolower($this->input->post('username', TRUE))),
addslashes($this->input->post('password', TRUE)),
$this->getIP())){
SWITCH($this->User->ID){
CASE 'BADUSERNAME':
$this->session->set_flashdata('user_msg', 'Invalid Username');
BREAK;
CASE 'BADPASSWORD':
$this->session->set_flashdata('user_msg', 'Invalid Password');
BREAK;
CASE 'ALREADYLOGGEDIN':
$this->session->set_flashdata('user_msg', 'You are logged in elsewhere.');
BREAK;
DEFAULT:
$this->session->set_flashdata('user_msg', 'Something has gone terribly wrong. Please try logging in again.');
BREAK;
}
redirect(base_url());
}
然后再往下一点,我加载页眉、正文和页脚视图 - 正文是应该显示错误消息的位置,但 不是。。
<div id="contentarea">
<div class="container">
<?PHP
ECHO $this->session->flashdata('show_validation') ? validation_errors() : '';
$error = $this->session->flashdata('user_msg'); //This is where it's supposed to get it...
IF ($error) //And this is where it's supposed to show it...
ECHO "<div class='error'>$error</div>";
?> //But the value is wiped so it only ever grabs NULL.
我在设置闪存数据后调用重定向后遵循执行路径,我注意到在重定向完成后它的执行链,它调用exit;。
然后从index.php 文件再次加载所有内容,当 Session 最终弹出时……值“user_msg”已无处可寻。
很明显我在这里做错了什么 - 我在这里做错了什么? flash_data 是否只会持续到调用重定向?甚至 session_data 值(调用$this->session->value = 'some arbitrary user message' 也无法持久化)。
如何在下次加载正文元素时保留该消息,以便它可以告诉用户“嘿,没有找到你”或“嘿,您的密码不正确”?
编辑 1
所以事实证明我不需要重定向我正在做的事情,因为 POST(提交用户名和密码)会为我处理。
我将把这个问题留给其他可能需要回答的人 - 也许答案只是 Flash 数据无法在重定向中存活?
【问题讨论】:
-
@ODelibalta“你使用的方法”——你指的是哪个?
-
我认为您应该考虑到许多网站没有告诉您用户名和/或密码不正确的原因。这是一个安全问题。如果您告诉攻击者他们的用户名很好但密码错误,那么您已经为他们提供了成功攻击您所需的 50%。
标签: php codeigniter session