我有这样的codeigniter模型
<?php
class Model_Login extends CI_Model{
function __construct(){
parent::__construct();
}
public function login_submit($arrayData){
extract($arrayData);
$username=clean($txtusername);
$password=clean($txtpassword);
//first get salt for the respective user.
$getsalt=$this->db->query("SELECT PASSWORD_SALT FROM USER_INFOS WHERE USER_NNAME=?",array($username))->row();
$salt=$getsalt->PASSWORD_SALT;
$password=sha1($salt.$password);
$query=$this->db->query("SELECT * FROM USER_INFOS WHERE STATUS='Y' AND USER_NNAME=? AND USER_PASSWORD=?",array($username,$password));
if($query->num_rows>0){
$row=$query->row();
// login successfull create session
$this->session->set_userdata('USER_ID', $row->USER_ID);
$this->session->set_userdata('USER_FULL_NAME', $row->USER_ENAME);
return "success";
}else{
return "Invalid username and/or password.";
}
}
}
?>
其中,PASSWORD_SALT 是一个数据库字段,包含使用hash
函数散列的 128 个字符长的随机(对于每个用户)盐。
USERNAME
如果代码是唯一的,则代码可以完美运行。但我试图想到可能会要求用户名不应该是唯一的客户。如果用户名不是唯一的,则始终选择第一行,并且除了具有相同用户名的用户之外的所有用户都无法登录,即使他们提供了有效的用户名和密码。
在这种情况下有什么更好的解决方法?
编辑
我知道USERNAME
不唯一是一个坏主意。但是在我们国家有几个网站的用户名不是唯一的(或者在某些情况下用户名甚至是可预测的)。例如,我在某个银行分行有一个帐户,其分行代码是032
,我的名字是 John Smith,那么访问他们的电子银行的用户名将是032JOHNS
,该分行中可能有多个 John Smith 最终具有相同的用户名。要登录他们的电子银行系统,我只需要提供这个用户名和我的密码。
谢谢